diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java index 1fa460cf61a00354e83d855b5d4d889aba9e0a37..bc365fcf78e6185565ec68088313e18a721b2375 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 b211316a993988bf8bc979b54c3931eb870e88ac..14c490d1877f20fda3954724e9630998bee9494d 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 d5d787a19586cb8510a3ecbc47ddbf9a8e7c9453..f76c45414863213a00743c08f4ad6bbfe9f0589c 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 2acab4cf1abb18a1644fc4ab3c9276d254bf33c8..7193c0849ae8f57a2fe04b701bc4d2c567e0b35d 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 76fb20d3f248db28523383d428d28970029f0107..0b50a7898126c235ed784e7499a83705dd0ce73d 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 dbe4f4613ced7d1c6ae9596cff59a09fd7692448..4c14ef1afbf03fc0ae67cfe9690b05cf3870b4b0 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 671cc3d7e9848a720f2818a38ad801bf659136c7..bb11ddd459dc852376691678e192d131c2c52c35 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 acb076e73ad97271c8bcc0231edc0ab2949fc421..b3279c3f1917b4e7b2ee6b8faa7a35de86bcc987 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 a2c2e14e9b88e045644f6e243deae7e1cb273fa2..1f1b205fd8026ca9dc11e6f84168f6adc49179ec 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 ca6771e20e1fcbab11b382f1fc781337eb7f0d70..d56dfb72691387680510a56ab929dd23fe020271 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 cb97a5570639bfd4e42a61a18b00fc0bf90201c4..6612f95fe593ce8e6446575eabbf922363a9e048 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 c936a9e4ed60000601b49329d0488180fe864c78..4e99e439c56dde2036ec979e345533e387a0be83 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 7d812ce4c5038a976ebbf653c49b4ed9dd9efaea..b3f6312dd58d85e7c10e5a2f18040b812a3922f8 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 52c40b056ab101ec66d0a41e720b809ea6451007..f72bb57abb95dc41a0b212a0ca20b553cabf4e0b 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<MessageId> acked = new ArrayList<MessageId>(); + int maxMessages = writer.getMaxMessagesForAck(length); + Collection<MessageId> ids = new ArrayList<MessageId>(); 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<MessageId> ids = new ArrayList<MessageId>(); + 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<MessageId> offered = new ArrayList<MessageId>(); + Collection<MessageId> ids = new ArrayList<MessageId>(); 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 c01501c92772dbac679d37912ebec82e6e5a653e..55aa1bcc76041d9061e77801afefb1ee59e4460d 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 9fa7f371b3cc909a3ee3f3046bd3f5c16ad8324c..bc44c3a5ff821800bbd8d838437322a928827524 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 5ddf2daeef50babafb97b77c94e4dcd960da26b7..39e4a76810813326d5b53886012619688376dfe7 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;