From 29a6596ee3084d15a32dfbf7d7631fa4e6cf6c34 Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Sun, 14 Dec 2014 15:18:39 +0000
Subject: [PATCH] Use the transport's idle timeout, not a hardcoded value.

---
 .../DroidtoothTransportConnection.java        |  4 +++
 .../plugins/tor/TorTransportConnection.java   |  4 +++
 .../messaging/MessagingSessionFactory.java    |  7 +++--
 .../org/briarproject/api/plugins/Plugin.java  |  3 +++
 .../plugins/TransportConnectionWriter.java    |  3 +++
 .../api/plugins/duplex/DuplexPlugin.java      |  3 ---
 .../messaging/DuplexOutgoingSession.java      | 10 +++----
 .../MessagingSessionFactoryImpl.java          | 15 +++++++----
 .../plugins/ConnectionManagerImpl.java        | 27 ++++++++++++++-----
 .../briarproject/plugins/file/FilePlugin.java |  4 +++
 .../plugins/file/FileTransportWriter.java     |  4 +++
 .../plugins/tcp/TcpTransportConnection.java   |  4 +++
 .../BluetoothTransportConnection.java         |  4 +++
 .../plugins/file/RemovableDrivePlugin.java    |  3 +--
 .../plugins/modem/ModemPlugin.java            |  8 ++++--
 15 files changed, 77 insertions(+), 26 deletions(-)

diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
index d349650735..68ff547a11 100644
--- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
+++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
@@ -68,6 +68,10 @@ class DroidtoothTransportConnection implements DuplexTransportConnection {
 			return plugin.getMaxLatency();
 		}
 
+		public long getMaxIdleTime() {
+			return plugin.getMaxIdleTime();
+		}
+
 		public long getCapacity() {
 			return Long.MAX_VALUE;
 		}
diff --git a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
index ab0969eae6..081bba1205 100644
--- a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
+++ b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
@@ -67,6 +67,10 @@ class TorTransportConnection implements DuplexTransportConnection {
 			return plugin.getMaxLatency();
 		}
 
+		public long getMaxIdleTime() {
+			return plugin.getMaxIdleTime();
+		}
+
 		public long getCapacity() {
 			return Long.MAX_VALUE;
 		}
diff --git a/briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java b/briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java
index c5ceca842c..d59b8ae9ab 100644
--- a/briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java
+++ b/briar-api/src/org/briarproject/api/messaging/MessagingSessionFactory.java
@@ -11,6 +11,9 @@ public interface MessagingSessionFactory {
 	MessagingSession createIncomingSession(ContactId c, TransportId t,
 			InputStream in);
 
-	MessagingSession createOutgoingSession(ContactId c, TransportId t,
-			long maxLatency, boolean duplex, OutputStream out);
+	MessagingSession createSimplexOutgoingSession(ContactId c, TransportId t,
+			long maxLatency, OutputStream out);
+
+	MessagingSession createDuplexOutgoingSession(ContactId c, TransportId t,
+			long maxLatency, long maxIdleTime, OutputStream out);
 }
diff --git a/briar-api/src/org/briarproject/api/plugins/Plugin.java b/briar-api/src/org/briarproject/api/plugins/Plugin.java
index 3389a73577..1048f04cff 100644
--- a/briar-api/src/org/briarproject/api/plugins/Plugin.java
+++ b/briar-api/src/org/briarproject/api/plugins/Plugin.java
@@ -17,6 +17,9 @@ public interface Plugin {
 	/** Returns the transport's maximum latency in milliseconds. */
 	long getMaxLatency();
 
+	/** Returns the transport's maximum idle time in milliseconds. */
+	long getMaxIdleTime();
+
 	/** Starts the plugin and returns true if it started successfully. */
 	boolean start() throws IOException;
 
diff --git a/briar-api/src/org/briarproject/api/plugins/TransportConnectionWriter.java b/briar-api/src/org/briarproject/api/plugins/TransportConnectionWriter.java
index 554e5de8a1..4613f0e768 100644
--- a/briar-api/src/org/briarproject/api/plugins/TransportConnectionWriter.java
+++ b/briar-api/src/org/briarproject/api/plugins/TransportConnectionWriter.java
@@ -15,6 +15,9 @@ public interface TransportConnectionWriter {
 	/** Returns the maximum latency of the transport in milliseconds. */
 	long getMaxLatency();
 
+	/** Returns the maximum idle time of the transport in milliseconds. */
+	long getMaxIdleTime();
+
 	/** Returns the capacity of the transport connection in bytes. */
 	long getCapacity();
 
diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java
index 43fcb3c82f..8712d7b792 100644
--- a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java
+++ b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexPlugin.java
@@ -7,9 +7,6 @@ import org.briarproject.api.plugins.Plugin;
 /** An interface for transport plugins that support duplex communication. */
 public interface DuplexPlugin extends Plugin {
 
-	/** Returns the transport's maximum idle time in milliseconds. */
-	long getMaxIdleTime();
-
 	/**
 	 * Attempts to create and return a connection to the given contact using
 	 * the current transport and configuration properties. Returns null if a
diff --git a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java b/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
index 9a1ac406d3..13e8395545 100644
--- a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
@@ -55,7 +55,6 @@ import org.briarproject.api.messaging.TransportUpdate;
  */
 class DuplexOutgoingSession implements MessagingSession, EventListener {
 
-	private static final int MAX_IDLE_TIME = 30 * 1000; // Milliseconds
 	private static final Logger LOG =
 			Logger.getLogger(DuplexOutgoingSession.class.getName());
 
@@ -69,7 +68,7 @@ class DuplexOutgoingSession implements MessagingSession, EventListener {
 	private final EventBus eventBus;
 	private final ContactId contactId;
 	private final TransportId transportId;
-	private final long maxLatency;
+	private final long maxLatency, maxIdleTime;
 	private final OutputStream out;
 	private final PacketWriter packetWriter;
 	private final BlockingQueue<ThrowingRunnable<IOException>> writerTasks;
@@ -79,13 +78,14 @@ class DuplexOutgoingSession implements MessagingSession, EventListener {
 	DuplexOutgoingSession(DatabaseComponent db, Executor dbExecutor,
 			EventBus eventBus, PacketWriterFactory packetWriterFactory,
 			ContactId contactId, TransportId transportId, long maxLatency,
-			OutputStream out) {
+			long maxIdleTime, OutputStream out) {
 		this.db = db;
 		this.dbExecutor = dbExecutor;
 		this.eventBus = eventBus;
 		this.contactId = contactId;
 		this.transportId = transportId;
 		this.maxLatency = maxLatency;
+		this.maxIdleTime = maxIdleTime;
 		this.out = out;
 		packetWriter = packetWriterFactory.createPacketWriter(out);
 		writerTasks = new LinkedBlockingQueue<ThrowingRunnable<IOException>>();
@@ -110,8 +110,8 @@ class DuplexOutgoingSession implements MessagingSession, EventListener {
 				while(!interrupted) {
 					// Flush the stream if it's going to be idle
 					if(writerTasks.isEmpty()) out.flush();
-					ThrowingRunnable<IOException> task = writerTasks.poll(
-							MAX_IDLE_TIME, MILLISECONDS);
+					ThrowingRunnable<IOException> task =
+							writerTasks.poll(maxIdleTime, MILLISECONDS);
 					if(task == null) {
 						LOG.info("Idle timeout");
 						continue; // Flush and wait again
diff --git a/briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java b/briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java
index 04895580cc..9ab638aa03 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java
+++ b/briar-core/src/org/briarproject/messaging/MessagingSessionFactoryImpl.java
@@ -49,11 +49,16 @@ class MessagingSessionFactoryImpl implements MessagingSessionFactory {
 				messageVerifier, packetReaderFactory, c, t, in);
 	}
 
-	public MessagingSession createOutgoingSession(ContactId c, TransportId t,
-			long maxLatency, boolean duplex, OutputStream out) {
-		if(duplex) return new DuplexOutgoingSession(db, dbExecutor, eventBus,
-				packetWriterFactory, c, t, maxLatency, out);
-		else return new SimplexOutgoingSession(db, dbExecutor, eventBus,
+	public MessagingSession createSimplexOutgoingSession(ContactId c,
+			TransportId t, long maxLatency, OutputStream out) {
+		return new SimplexOutgoingSession(db, dbExecutor, eventBus,
 				packetWriterFactory, c, t, maxLatency, out);
 	}
+
+	public MessagingSession createDuplexOutgoingSession(ContactId c,
+			TransportId t, long maxLatency, long maxIdleTime,
+			OutputStream out) {
+		return new DuplexOutgoingSession(db, dbExecutor, eventBus,
+				packetWriterFactory, c, t, maxLatency, maxIdleTime, out);
+	}
 }
diff --git a/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java b/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
index d94e1f80ec..9dad32f2e2 100644
--- a/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
+++ b/briar-core/src/org/briarproject/plugins/ConnectionManagerImpl.java
@@ -107,14 +107,27 @@ class ConnectionManagerImpl implements ConnectionManager {
 		}
 	}
 
-	private MessagingSession createOutgoingSession(StreamContext ctx,
-			TransportConnectionWriter w, boolean duplex) throws IOException {
+	private MessagingSession createSimplexOutgoingSession(StreamContext ctx,
+			TransportConnectionWriter w) throws IOException {
 		try {
 			StreamWriter streamWriter = streamWriterFactory.createStreamWriter(
 					w.getOutputStream(), w.getMaxFrameLength(), ctx);
-			return messagingSessionFactory.createOutgoingSession(
+			return messagingSessionFactory.createSimplexOutgoingSession(
 					ctx.getContactId(), ctx.getTransportId(), w.getMaxLatency(),
-					duplex, streamWriter.getOutputStream());
+					streamWriter.getOutputStream());
+		} finally {
+			ByteUtils.erase(ctx.getSecret());
+		}
+	}
+
+	private MessagingSession createDuplexOutgoingSession(StreamContext ctx,
+			TransportConnectionWriter w) throws IOException {
+		try {
+			StreamWriter streamWriter = streamWriterFactory.createStreamWriter(
+					w.getOutputStream(), w.getMaxFrameLength(), ctx);
+			return messagingSessionFactory.createDuplexOutgoingSession(
+					ctx.getContactId(), ctx.getTransportId(), w.getMaxLatency(),
+					w.getMaxIdleTime(), streamWriter.getOutputStream());
 		} finally {
 			ByteUtils.erase(ctx.getSecret());
 		}
@@ -199,7 +212,7 @@ class ConnectionManagerImpl implements ConnectionManager {
 			connectionRegistry.registerConnection(contactId, transportId);
 			try {
 				// Create and run the outgoing session
-				createOutgoingSession(ctx, writer, false).run();
+				createSimplexOutgoingSession(ctx, writer).run();
 				disposeWriter(false);
 			} catch(IOException e) {
 				if(LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
@@ -287,7 +300,7 @@ class ConnectionManagerImpl implements ConnectionManager {
 			}
 			try {
 				// Create and run the outgoing session
-				outgoingSession = createOutgoingSession(ctx, writer, true);
+				outgoingSession = createDuplexOutgoingSession(ctx, writer);
 				outgoingSession.run();
 				disposeWriter(false);
 			} catch(IOException e) {
@@ -353,7 +366,7 @@ class ConnectionManagerImpl implements ConnectionManager {
 			});
 			try {
 				// Create and run the outgoing session
-				outgoingSession = createOutgoingSession(ctx, writer, true);
+				outgoingSession = createDuplexOutgoingSession(ctx, writer);
 				outgoingSession.run();
 				disposeWriter(false);
 			} catch(IOException e) {
diff --git a/briar-core/src/org/briarproject/plugins/file/FilePlugin.java b/briar-core/src/org/briarproject/plugins/file/FilePlugin.java
index 1af4215ba6..9c298b0232 100644
--- a/briar-core/src/org/briarproject/plugins/file/FilePlugin.java
+++ b/briar-core/src/org/briarproject/plugins/file/FilePlugin.java
@@ -56,6 +56,10 @@ public abstract class FilePlugin implements SimplexPlugin {
 		return maxLatency;
 	}
 
+	public long getMaxIdleTime() {
+		return Long.MAX_VALUE; // We don't need keepalives
+	}
+
 	public boolean isRunning() {
 		return running;
 	}
diff --git a/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java b/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java
index 2ca55593fc..ecba989ffe 100644
--- a/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java
+++ b/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java
@@ -35,6 +35,10 @@ class FileTransportWriter implements TransportConnectionWriter {
 		return plugin.getMaxLatency();
 	}
 
+	public long getMaxIdleTime() {
+		return plugin.getMaxIdleTime();
+	}
+
 	public long getCapacity() {
 		return capacity;
 	}
diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
index 83506a2116..2df916265d 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
@@ -67,6 +67,10 @@ class TcpTransportConnection implements DuplexTransportConnection {
 			return plugin.getMaxLatency();
 		}
 
+		public long getMaxIdleTime() {
+			return plugin.getMaxIdleTime();
+		}
+
 		public long getCapacity() {
 			return Long.MAX_VALUE;
 		}
diff --git a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
index 8a2c796725..3de6a6a105 100644
--- a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
+++ b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
@@ -68,6 +68,10 @@ class BluetoothTransportConnection implements DuplexTransportConnection {
 			return plugin.getMaxLatency();
 		}
 
+		public long getMaxIdleTime() {
+			return plugin.getMaxIdleTime();
+		}
+
 		public long getCapacity() {
 			return Long.MAX_VALUE;
 		}
diff --git a/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java b/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java
index 09ffd6f663..bdf9d84ef9 100644
--- a/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/file/RemovableDrivePlugin.java
@@ -29,8 +29,7 @@ implements RemovableDriveMonitor.Callback {
 
 	RemovableDrivePlugin(Executor ioExecutor, FileUtils fileUtils,
 			SimplexPluginCallback callback, RemovableDriveFinder finder,
-			RemovableDriveMonitor monitor, int maxFrameLength,
-			long maxLatency) {
+			RemovableDriveMonitor monitor, int maxFrameLength, long maxLatency) {
 		super(ioExecutor, fileUtils, callback, maxFrameLength, maxLatency);
 		this.finder = finder;
 		this.monitor = monitor;
diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
index 825fc36813..9836284977 100644
--- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
@@ -223,11 +223,15 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 		private class Writer implements TransportConnectionWriter {
 
 			public int getMaxFrameLength() {
-				return maxFrameLength;
+				return getMaxFrameLength();
 			}
 
 			public long getMaxLatency() {
-				return maxLatency;
+				return getMaxLatency();
+			}
+
+			public long getMaxIdleTime() {
+				return getMaxIdleTime();
 			}
 
 			public long getCapacity() {
-- 
GitLab