diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java index 1fa460cf6..bc365fcf7 100644 --- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java +++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java @@ -34,10 +34,6 @@ class DroidtoothTransportConnection implements DuplexTransportConnection { return socket.getOutputStream(); } - public boolean shouldFlush() { - return true; - } - public void dispose(boolean exception, boolean recognised) throws IOException { socket.close(); diff --git a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java index b211316a9..14c490d18 100644 --- a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java +++ b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java @@ -34,10 +34,6 @@ class TorTransportConnection implements DuplexTransportConnection { return socket.getOutputStream(); } - public boolean shouldFlush() { - return true; - } - public void dispose(boolean exception, boolean recognised) throws IOException { socket.close(); diff --git a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java index d5d787a19..f76c45414 100644 --- a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java +++ b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java @@ -4,6 +4,8 @@ import java.io.IOException; public interface PacketWriter { + int getMaxMessagesForAck(long capacity); + int getMaxMessagesForRequest(long capacity); int getMaxMessagesForOffer(long capacity); diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java index 2acab4cf1..7193c0849 100644 --- a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java +++ b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java @@ -23,11 +23,6 @@ public interface DuplexTransportConnection { /** Returns an output stream for writing to the connection. */ OutputStream getOutputStream() throws IOException; - /** - * Returns true if the output stream should be flushed after each packet. - */ - boolean shouldFlush(); - /** * Closes the connection and disposes of any associated resources. The * first argument indicates whether the connection is being closed because diff --git a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java index 76fb20d3f..0b50a7898 100644 --- a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java +++ b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java @@ -21,11 +21,6 @@ public interface SimplexTransportWriter { /** Returns an output stream for writing to the transport. */ OutputStream getOutputStream() throws IOException; - /** - * Returns true if the output stream should be flushed after each packet. - */ - boolean shouldFlush(); - /** * Closes the writer and disposes of any associated resources. The * argument indicates whether the writer is being closed because of an diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java b/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java index dbe4f4613..4c14ef1af 100644 --- a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java +++ b/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java @@ -21,8 +21,7 @@ class PacketWriterFactoryImpl implements PacketWriterFactory { this.writerFactory = writerFactory; } - public PacketWriter createPacketWriter(OutputStream out, - boolean flush) { + public PacketWriter createPacketWriter(OutputStream out, boolean flush) { return new PacketWriterImpl(serial, writerFactory, out, flush); } } diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java b/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java index 671cc3d7e..bb11ddd45 100644 --- a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java +++ b/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java @@ -47,19 +47,21 @@ class PacketWriterImpl implements PacketWriter { w = writerFactory.createWriter(out); } + public int getMaxMessagesForAck(long capacity) { + return getMaxMessagesForPacket(capacity, ACK); + } + public int getMaxMessagesForRequest(long capacity) { - int packet = (int) Math.min(capacity, MAX_PACKET_LENGTH); - int overhead = serial.getSerialisedStructStartLength(ACK) - + serial.getSerialisedListStartLength() - + serial.getSerialisedListEndLength() - + serial.getSerialisedStructEndLength(); - int idLength = serial.getSerialisedUniqueIdLength(); - return (packet - overhead) / idLength; + return getMaxMessagesForPacket(capacity, REQUEST); } public int getMaxMessagesForOffer(long capacity) { + return getMaxMessagesForPacket(capacity, OFFER); + } + + private int getMaxMessagesForPacket(long capacity, int structId) { int packet = (int) Math.min(capacity, MAX_PACKET_LENGTH); - int overhead = serial.getSerialisedStructStartLength(OFFER) + int overhead = serial.getSerialisedStructStartLength(structId) + serial.getSerialisedListStartLength() + serial.getSerialisedListEndLength() + serial.getSerialisedStructEndLength(); diff --git a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java index acb076e73..b3279c3f1 100644 --- a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java +++ b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java @@ -226,8 +226,7 @@ abstract class DuplexConnection implements EventListener { db.addListener(this); try { OutputStream out = createConnectionWriter().getOutputStream(); - writer = packetWriterFactory.createPacketWriter(out, - transport.shouldFlush()); + writer = packetWriterFactory.createPacketWriter(out, true); if(LOG.isLoggable(INFO)) LOG.info("Starting to write"); // Send the initial packets dbExecutor.execute(new GenerateTransportAcks()); @@ -500,7 +499,7 @@ abstract class DuplexConnection implements EventListener { public void run() { assert writer != null; - int maxMessages = writer.getMaxMessagesForRequest(Long.MAX_VALUE); + int maxMessages = writer.getMaxMessagesForAck(Long.MAX_VALUE); try { Ack a = db.generateAck(contactId, maxMessages); if(LOG.isLoggable(INFO)) diff --git a/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java b/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java index a2c2e14e9..1f1b205fd 100644 --- a/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java +++ b/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java @@ -72,7 +72,7 @@ class OutgoingSimplexConnection { if(conn.getRemainingCapacity() < MAX_PACKET_LENGTH) throw new EOFException(); PacketWriter writer = packetWriterFactory.createPacketWriter(out, - transport.shouldFlush()); + false); // Send the initial packets: updates and acks boolean hasSpace = writeTransportAcks(conn, writer); if(hasSpace) hasSpace = writeTransportUpdates(conn, writer); @@ -82,12 +82,12 @@ class OutgoingSimplexConnection { if(hasSpace) hasSpace = writeRetentionUpdate(conn, writer); // Write acks until you can't write acks no more capacity = conn.getRemainingCapacity(); - int maxMessages = writer.getMaxMessagesForRequest(capacity); + int maxMessages = writer.getMaxMessagesForAck(capacity); Ack a = db.generateAck(contactId, maxMessages); while(a != null) { writer.writeAck(a); capacity = conn.getRemainingCapacity(); - maxMessages = writer.getMaxMessagesForRequest(capacity); + maxMessages = writer.getMaxMessagesForAck(capacity); a = db.generateAck(contactId, maxMessages); } // Write messages until you can't write messages no more diff --git a/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java b/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java index ca6771e20..d56dfb726 100644 --- a/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java +++ b/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java @@ -43,10 +43,6 @@ class FileTransportWriter implements SimplexTransportWriter { return out; } - public boolean shouldFlush() { - return false; - } - public void dispose(boolean exception) { try { out.close(); diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java index cb97a5570..6612f95fe 100644 --- a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java +++ b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java @@ -34,10 +34,6 @@ class TcpTransportConnection implements DuplexTransportConnection { return socket.getOutputStream(); } - public boolean shouldFlush() { - return true; - } - public void dispose(boolean exception, boolean recognised) throws IOException { socket.close(); diff --git a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java index c936a9e4e..4e99e439c 100644 --- a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java +++ b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java @@ -35,10 +35,6 @@ class BluetoothTransportConnection implements DuplexTransportConnection { return stream.openOutputStream(); } - public boolean shouldFlush() { - return true; - } - public void dispose(boolean exception, boolean recognised) throws IOException { stream.close(); diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java index 7d812ce4c..b3f6312dd 100644 --- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java +++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java @@ -250,10 +250,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback { return modem.getOutputStream(); } - public boolean shouldFlush() { - return true; - } - public void dispose(boolean exception, boolean recognised) { if(LOG.isLoggable(INFO)) LOG.info("Call disconnected"); try { diff --git a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java b/briar-tests/src/org/briarproject/messaging/ConstantsTest.java index 52c40b056..f72bb57ab 100644 --- a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java +++ b/briar-tests/src/org/briarproject/messaging/ConstantsTest.java @@ -39,6 +39,7 @@ import org.briarproject.api.messaging.MessageId; import org.briarproject.api.messaging.Offer; import org.briarproject.api.messaging.PacketWriter; import org.briarproject.api.messaging.PacketWriterFactory; +import org.briarproject.api.messaging.Request; import org.briarproject.api.messaging.SubscriptionUpdate; import org.briarproject.api.messaging.TransportUpdate; import org.briarproject.crypto.CryptoModule; @@ -153,6 +154,16 @@ public class ConstantsTest extends BriarTestCase { testMessageIdsFitIntoOffer(1000); } + @Test + public void testMessageIdsFitIntoLargeRequest() throws Exception { + testMessageIdsFitIntoRequest(MAX_PACKET_LENGTH); + } + + @Test + public void testMessageIdsFitIntoSmallRequest() throws Exception { + testMessageIdsFitIntoRequest(1000); + } + @Test public void testPropertiesFitIntoTransportUpdate() throws Exception { // Create the maximum number of properties with the maximum length @@ -195,24 +206,37 @@ public class ConstantsTest extends BriarTestCase { // Create an ack with as many message IDs as possible ByteArrayOutputStream out = new ByteArrayOutputStream(length); PacketWriter writer = packetWriterFactory.createPacketWriter(out, true); - int maxMessages = writer.getMaxMessagesForRequest(length); - Collection acked = new ArrayList(); + int maxMessages = writer.getMaxMessagesForAck(length); + Collection ids = new ArrayList(); for(int i = 0; i < maxMessages; i++) - acked.add(new MessageId(TestUtils.getRandomId())); - writer.writeAck(new Ack(acked)); + ids.add(new MessageId(TestUtils.getRandomId())); + writer.writeAck(new Ack(ids)); // Check the size of the serialised ack assertTrue(out.size() <= length); } + private void testMessageIdsFitIntoRequest(int length) throws Exception { + // Create a request with as many message IDs as possible + ByteArrayOutputStream out = new ByteArrayOutputStream(length); + PacketWriter writer = packetWriterFactory.createPacketWriter(out, true); + int maxMessages = writer.getMaxMessagesForRequest(length); + Collection ids = new ArrayList(); + for(int i = 0; i < maxMessages; i++) + ids.add(new MessageId(TestUtils.getRandomId())); + writer.writeRequest(new Request(ids)); + // Check the size of the serialised request + assertTrue(out.size() <= length); + } + private void testMessageIdsFitIntoOffer(int length) throws Exception { // Create an offer with as many message IDs as possible ByteArrayOutputStream out = new ByteArrayOutputStream(length); PacketWriter writer = packetWriterFactory.createPacketWriter(out, true); int maxMessages = writer.getMaxMessagesForOffer(length); - Collection offered = new ArrayList(); + Collection ids = new ArrayList(); for(int i = 0; i < maxMessages; i++) - offered.add(new MessageId(TestUtils.getRandomId())); - writer.writeOffer(new Offer(offered)); + ids.add(new MessageId(TestUtils.getRandomId())); + writer.writeOffer(new Offer(ids)); // Check the size of the serialised offer assertTrue(out.size() <= length); } diff --git a/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java b/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java index c01501c92..55aa1bcc7 100644 --- a/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java +++ b/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java @@ -85,7 +85,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase { public void testConnectionTooShort() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); TestSimplexTransportWriter transport = new TestSimplexTransportWriter( - out, MAX_PACKET_LENGTH, Long.MAX_VALUE, true); + out, MAX_PACKET_LENGTH, Long.MAX_VALUE); ConnectionContext ctx = new ConnectionContext(contactId, transportId, secret, 0, true); OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db, @@ -103,7 +103,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase { public void testNothingToSend() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); TestSimplexTransportWriter transport = new TestSimplexTransportWriter( - out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE, true); + out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE); ConnectionContext ctx = new ConnectionContext(contactId, transportId, secret, 0, true); OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db, @@ -152,7 +152,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase { public void testSomethingToSend() throws Exception { ByteArrayOutputStream out = new ByteArrayOutputStream(); TestSimplexTransportWriter transport = new TestSimplexTransportWriter( - out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE, true); + out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE); ConnectionContext ctx = new ConnectionContext(contactId, transportId, secret, 0, true); OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db, diff --git a/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java b/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java index 9fa7f371b..bc44c3a5f 100644 --- a/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java +++ b/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java @@ -146,7 +146,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase { PacketWriterFactory packetWriterFactory = alice.getInstance(PacketWriterFactory.class); TestSimplexTransportWriter transport = new TestSimplexTransportWriter( - out, Long.MAX_VALUE, Long.MAX_VALUE, false); + out, Long.MAX_VALUE, Long.MAX_VALUE); ConnectionContext ctx = km.getConnectionContext(contactId, transportId); assertNotNull(ctx); OutgoingSimplexConnection simplex = new OutgoingSimplexConnection(db, diff --git a/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java b/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java index 5ddf2daee..39e4a7681 100644 --- a/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java +++ b/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java @@ -11,16 +11,14 @@ class TestSimplexTransportWriter implements SimplexTransportWriter { private final ByteArrayOutputStream out; private final long capacity, maxLatency; - private final boolean flush; private boolean disposed = false, exception = false; TestSimplexTransportWriter(ByteArrayOutputStream out, long capacity, - long maxLatency, boolean flush) { + long maxLatency) { this.out = out; this.capacity = capacity; this.maxLatency = maxLatency; - this.flush = flush; } public long getCapacity() { @@ -39,10 +37,6 @@ class TestSimplexTransportWriter implements SimplexTransportWriter { return out; } - public boolean shouldFlush() { - return flush; - } - public void dispose(boolean exception) { assert !disposed; disposed = true;