From a73d9d05f2d551fe117999d31ba6b5c304df0a33 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Fri, 1 Feb 2013 20:19:23 +0000
Subject: [PATCH] Added getMaxLatency() method to transport plugins.

---
 .../src/net/sf/briar/api/plugins/Plugin.java   |  3 +++
 .../plugins/bluetooth/BluetoothPlugin.java     | 10 ++++++++--
 .../bluetooth/BluetoothPluginFactory.java      |  5 +++--
 .../plugins/droidtooth/DroidtoothPlugin.java   | 10 ++++++++--
 .../droidtooth/DroidtoothPluginFactory.java    |  5 +++--
 .../plugins/file/RemovableDrivePlugin.java     |  8 +++++++-
 .../file/RemovableDrivePluginFactory.java      |  4 +++-
 .../sf/briar/plugins/modem/ModemPlugin.java    | 11 ++++++++---
 .../plugins/modem/ModemPluginFactory.java      |  3 ++-
 .../net/sf/briar/plugins/tcp/LanTcpPlugin.java |  5 +++--
 .../briar/plugins/tcp/LanTcpPluginFactory.java |  3 ++-
 .../net/sf/briar/plugins/tcp/TcpPlugin.java    | 10 ++++++++--
 .../net/sf/briar/plugins/tcp/WanTcpPlugin.java |  6 +++---
 .../briar/plugins/tcp/WanTcpPluginFactory.java |  5 +++--
 .../net/sf/briar/plugins/tor/TorPlugin.java    | 10 ++++++++--
 .../sf/briar/plugins/tor/TorPluginFactory.java |  4 +++-
 .../plugins/bluetooth/BluetoothClientTest.java |  3 ++-
 .../plugins/bluetooth/BluetoothServerTest.java |  3 ++-
 .../plugins/file/RemovableDrivePluginTest.java | 18 +++++++++---------
 .../briar/plugins/modem/ModemPluginTest.java   | 10 +++++-----
 .../sf/briar/plugins/tcp/LanTcpClientTest.java |  2 +-
 .../sf/briar/plugins/tcp/LanTcpPluginTest.java |  4 ++--
 .../sf/briar/plugins/tcp/LanTcpServerTest.java |  2 +-
 .../sf/briar/plugins/tor/TorPluginTest.java    |  8 ++++----
 24 files changed, 101 insertions(+), 51 deletions(-)

diff --git a/briar-api/src/net/sf/briar/api/plugins/Plugin.java b/briar-api/src/net/sf/briar/api/plugins/Plugin.java
index f76833a39f..2719736f69 100644
--- a/briar-api/src/net/sf/briar/api/plugins/Plugin.java
+++ b/briar-api/src/net/sf/briar/api/plugins/Plugin.java
@@ -14,6 +14,9 @@ public interface Plugin {
 	/** Returns a label for looking up the plugin's translated name. */
 	String getName();
 
+	/** Returns the transport's maximum latency in milliseconds. */
+	long getMaxLatency();
+
 	/** Starts the plugin and returns true if it started successfully. */
 	boolean start() throws IOException;
 
diff --git a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
index 6f185e31a0..78734a0e3b 100644
--- a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
@@ -50,7 +50,7 @@ class BluetoothPlugin implements DuplexPlugin {
 	private final Executor pluginExecutor;
 	private final Clock clock;
 	private final DuplexPluginCallback callback;
-	private final long pollingInterval;
+	private final long maxLatency, pollingInterval;
 	private final Object discoveryLock = new Object();
 	private final ScheduledExecutorService scheduler;
 
@@ -61,10 +61,12 @@ class BluetoothPlugin implements DuplexPlugin {
 	private volatile LocalDevice localDevice = null;
 
 	BluetoothPlugin(@PluginExecutor Executor pluginExecutor, Clock clock,
-			DuplexPluginCallback callback, long pollingInterval) {
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval) {
 		this.pluginExecutor = pluginExecutor;
 		this.clock = clock;
 		this.callback = callback;
+		this.maxLatency = maxLatency;
 		this.pollingInterval = pollingInterval;
 		scheduler = Executors.newScheduledThreadPool(0);
 	}
@@ -77,6 +79,10 @@ class BluetoothPlugin implements DuplexPlugin {
 		return "BLUETOOTH_PLUGIN_NAME";
 	}
 
+	public long getMaxLatency() {
+		return maxLatency;
+	}
+
 	public boolean start() throws IOException {
 		// Initialise the Bluetooth stack
 		try {
diff --git a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
index 2d909bc5ff..54e813be3c 100644
--- a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
@@ -12,7 +12,8 @@ import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
 
 public class BluetoothPluginFactory implements DuplexPluginFactory {
 
-	private static final long POLLING_INTERVAL = 3L * 60L * 1000L; // 3 mins
+	private static final long MAX_LATENCY = 60L * 1000L; // 1 minute
+	private static final long POLLING_INTERVAL = 3L * 60L * 1000L; // 3 minutes
 
 	private final Executor pluginExecutor;
 	private final Clock clock;
@@ -28,6 +29,6 @@ public class BluetoothPluginFactory implements DuplexPluginFactory {
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
 		return new BluetoothPlugin(pluginExecutor, clock, callback,
-				POLLING_INTERVAL);
+				MAX_LATENCY, POLLING_INTERVAL);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
index ea7dc74b2a..a20da57a9f 100644
--- a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
@@ -60,7 +60,7 @@ class DroidtoothPlugin implements DuplexPlugin {
 	private final AndroidExecutor androidExecutor;
 	private final Context appContext;
 	private final DuplexPluginCallback callback;
-	private final long pollingInterval;
+	private final long maxLatency, pollingInterval;
 
 	private volatile boolean running = false;
 	private volatile BluetoothServerSocket socket = null;
@@ -70,11 +70,13 @@ class DroidtoothPlugin implements DuplexPlugin {
 
 	DroidtoothPlugin(@PluginExecutor Executor pluginExecutor,
 			AndroidExecutor androidExecutor, Context appContext,
-			DuplexPluginCallback callback, long pollingInterval) {
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval) {
 		this.pluginExecutor = pluginExecutor;
 		this.androidExecutor = androidExecutor;
 		this.appContext = appContext;
 		this.callback = callback;
+		this.maxLatency = maxLatency;
 		this.pollingInterval = pollingInterval;
 	}
 
@@ -87,6 +89,10 @@ class DroidtoothPlugin implements DuplexPlugin {
 		return "BLUETOOTH_PLUGIN_NAME";
 	}
 
+	public long getMaxLatency() {
+		return maxLatency;
+	}
+
 	public boolean start() throws IOException {
 		// BluetoothAdapter.getDefaultAdapter() must be called on a thread
 		// with a message queue, so submit it to the AndroidExecutor
diff --git a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java
index 501944d4d2..a0a2b385ef 100644
--- a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java
@@ -12,7 +12,8 @@ import android.content.Context;
 
 public class DroidtoothPluginFactory implements DuplexPluginFactory {
 
-	private static final long POLLING_INTERVAL = 3L * 60L * 1000L; // 3 mins
+	private static final long MAX_LATENCY = 60L * 1000L; // 1 minute
+	private static final long POLLING_INTERVAL = 3L * 60L * 1000L; // 3 minutes
 
 	private final Executor pluginExecutor;
 	private final AndroidExecutor androidExecutor;
@@ -31,6 +32,6 @@ public class DroidtoothPluginFactory implements DuplexPluginFactory {
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
 		return new DroidtoothPlugin(pluginExecutor, androidExecutor, appContext,
-				callback, POLLING_INTERVAL);
+				callback, MAX_LATENCY, POLLING_INTERVAL);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java
index a647c1507c..c0d3192015 100644
--- a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java
@@ -31,13 +31,15 @@ implements RemovableDriveMonitor.Callback {
 
 	private final RemovableDriveFinder finder;
 	private final RemovableDriveMonitor monitor;
+	private final long maxLatency;
 
 	RemovableDrivePlugin(@PluginExecutor Executor pluginExecutor,
 			SimplexPluginCallback callback, RemovableDriveFinder finder,
-			RemovableDriveMonitor monitor) {
+			RemovableDriveMonitor monitor, long maxLatency) {
 		super(pluginExecutor, callback);
 		this.finder = finder;
 		this.monitor = monitor;
+		this.maxLatency = maxLatency;
 	}
 
 	public TransportId getId() {
@@ -48,6 +50,10 @@ implements RemovableDriveMonitor.Callback {
 		return "REMOVABLE_DRIVE_PLUGIN_NAME";
 	}
 
+	public long getMaxLatency() {
+		return maxLatency;
+	}
+
 	public boolean start() throws IOException {
 		running = true;
 		monitor.start(this);
diff --git a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
index ed5594027b..c5a563bb22 100644
--- a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
@@ -11,6 +11,8 @@ import net.sf.briar.util.OsUtils;
 
 public class RemovableDrivePluginFactory implements SimplexPluginFactory {
 
+	// Maximum latency 14 days (Royal Mail or lackadaisical carrier pigeon)
+	private static final long MAX_LATENCY = 14L * 24L * 60L * 60L * 1000L;
 	private static final long POLLING_INTERVAL = 10L * 1000L; // 10 seconds
 
 	private final Executor pluginExecutor;
@@ -46,6 +48,6 @@ public class RemovableDrivePluginFactory implements SimplexPluginFactory {
 			return null;
 		}
 		return new RemovableDrivePlugin(pluginExecutor, callback, finder,
-				monitor);
+				monitor, MAX_LATENCY);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java b/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java
index 49184a8c48..5e459b6dde 100644
--- a/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java
@@ -41,7 +41,7 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 	private final ModemFactory modemFactory;
 	private final SerialPortList serialPortList;
 	private final DuplexPluginCallback callback;
-	private final long pollingInterval;
+	private final long maxLatency, pollingInterval;
 	private final boolean shuffle; // Used to disable shuffling for testing
 
 	private volatile boolean running = false;
@@ -49,12 +49,13 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 
 	ModemPlugin(@PluginExecutor Executor pluginExecutor,
 			ModemFactory modemFactory, SerialPortList serialPortList,
-			DuplexPluginCallback callback, long pollingInterval,
-			boolean shuffle) {
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval, boolean shuffle) {
 		this.pluginExecutor = pluginExecutor;
 		this.modemFactory = modemFactory;
 		this.serialPortList = serialPortList;
 		this.callback = callback;
+		this.maxLatency = maxLatency;
 		this.pollingInterval = pollingInterval;
 		this.shuffle = shuffle;
 	}
@@ -67,6 +68,10 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 		return "MODEM_PLUGIN_NAME";
 	}
 
+	public long getMaxLatency() {
+		return maxLatency;
+	}
+
 	public boolean start() {
 		for(String portName : serialPortList.getPortNames()) {
 			if(LOG.isLoggable(INFO))
diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java b/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java
index cf5c2eb531..59f684a075 100644
--- a/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java
@@ -12,6 +12,7 @@ import net.sf.briar.util.StringUtils;
 
 public class ModemPluginFactory implements DuplexPluginFactory {
 
+	private static final long MAX_LATENCY = 60L * 1000L; // 1 minute
 	private static final long POLLING_INTERVAL = 60L * 60L * 1000L; // 1 hour
 
 	private final Executor pluginExecutor;
@@ -34,6 +35,6 @@ public class ModemPluginFactory implements DuplexPluginFactory {
 		String enabled = callback.getConfig().get("enabled");
 		if(StringUtils.isNullOrEmpty(enabled)) return null;
 		return new ModemPlugin(pluginExecutor, modemFactory, serialPortList,
-				callback, POLLING_INTERVAL, true);
+				callback, MAX_LATENCY, POLLING_INTERVAL, true);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java
index 243488a32d..2b00190a9c 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java
@@ -46,8 +46,9 @@ class LanTcpPlugin extends TcpPlugin {
 	private final Clock clock;
 
 	LanTcpPlugin(@PluginExecutor Executor pluginExecutor, Clock clock,
-			DuplexPluginCallback callback, long pollingInterval) {
-		super(pluginExecutor, callback, pollingInterval);
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval) {
+		super(pluginExecutor, callback, maxLatency, pollingInterval);
 		this.clock = clock;
 	}
 
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java
index 9a930c15a3..69e13e9f0a 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java
@@ -12,6 +12,7 @@ import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
 
 public class LanTcpPluginFactory implements DuplexPluginFactory {
 
+	private static final long MAX_LATENCY = 60L * 1000L; // 1 minute
 	private static final long POLLING_INTERVAL = 60L * 1000L; // 1 minute
 
 	private final Executor pluginExecutor;
@@ -27,7 +28,7 @@ public class LanTcpPluginFactory implements DuplexPluginFactory {
 	}
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
-		return new LanTcpPlugin(pluginExecutor, clock, callback,
+		return new LanTcpPlugin(pluginExecutor, clock, callback, MAX_LATENCY,
 				POLLING_INTERVAL);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/TcpPlugin.java b/briar-core/src/net/sf/briar/plugins/tcp/TcpPlugin.java
index 61432c4183..5af3fd8b06 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/TcpPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/TcpPlugin.java
@@ -31,7 +31,7 @@ abstract class TcpPlugin implements DuplexPlugin {
 
 	protected final Executor pluginExecutor;
 	protected final DuplexPluginCallback callback;
-	protected final long pollingInterval;
+	protected final long maxLatency, pollingInterval;
 
 	protected volatile boolean running = false;
 	private volatile ServerSocket socket = null;
@@ -43,12 +43,18 @@ abstract class TcpPlugin implements DuplexPlugin {
 	protected abstract List<SocketAddress> getLocalSocketAddresses();
 
 	protected TcpPlugin(@PluginExecutor Executor pluginExecutor,
-			DuplexPluginCallback callback, long pollingInterval) {
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval) {
 		this.pluginExecutor = pluginExecutor;
 		this.callback = callback;
+		this.maxLatency = maxLatency;
 		this.pollingInterval = pollingInterval;
 	}
 
+	public long getMaxLatency() {
+		return maxLatency;
+	}
+
 	public boolean start() {
 		running = true;
 		pluginExecutor.execute(new Runnable() {
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java
index dd688c1014..19bfb3321c 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java
@@ -38,9 +38,9 @@ class WanTcpPlugin extends TcpPlugin {
 	private volatile MappingResult mappingResult;
 
 	WanTcpPlugin(@PluginExecutor Executor pluginExecutor,
-			DuplexPluginCallback callback, long pollingInterval,
-			PortMapper portMapper) {
-		super(pluginExecutor, callback, pollingInterval);
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval, PortMapper portMapper) {
+		super(pluginExecutor, callback, maxLatency, pollingInterval);
 		this.portMapper = portMapper;
 	}
 
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java
index 8adbc2cc1b..b36dba318a 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java
@@ -11,6 +11,7 @@ import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
 
 public class WanTcpPluginFactory implements DuplexPluginFactory {
 
+	private static final long MAX_LATENCY = 1L * 60L; // 1 minute
 	private static final long POLLING_INTERVAL = 5L * 60L * 1000L; // 5 minutes
 
 	private final Executor pluginExecutor;
@@ -27,7 +28,7 @@ public class WanTcpPluginFactory implements DuplexPluginFactory {
 	}
 
 	public DuplexPlugin createPlugin(DuplexPluginCallback callback) {
-		return new WanTcpPlugin(pluginExecutor, callback, POLLING_INTERVAL,
-				new PortMapperImpl(shutdownManager));
+		return new WanTcpPlugin(pluginExecutor, callback, MAX_LATENCY,
+				POLLING_INTERVAL, new PortMapperImpl(shutdownManager));
 	}
 }
diff --git a/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java b/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java
index 325e6e277b..2b1fea717d 100644
--- a/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java
@@ -46,16 +46,18 @@ class TorPlugin implements DuplexPlugin {
 
 	private final Executor pluginExecutor;
 	private final DuplexPluginCallback callback;
-	private final long pollingInterval;
+	private final long maxLatency, pollingInterval;
 
 	private boolean running = false, connected = false; // Locking: this
 	private NetLayer netLayer = null; // Locking: this
 	private NetServerSocket socket = null; // Locking: this
 
 	TorPlugin(@PluginExecutor Executor pluginExecutor,
-			DuplexPluginCallback callback, long pollingInterval) {
+			DuplexPluginCallback callback, long maxLatency,
+			long pollingInterval) {
 		this.pluginExecutor = pluginExecutor;
 		this.callback = callback;
+		this.maxLatency = maxLatency;
 		this.pollingInterval = pollingInterval;
 	}
 
@@ -67,6 +69,10 @@ class TorPlugin implements DuplexPlugin {
 		return "TOR_PLUGIN_NAME";
 	}
 
+	public long getMaxLatency() {
+		return maxLatency;
+	}
+
 	public boolean start() {
 		synchronized(this) {
 			running = true;
diff --git a/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java
index c5eb7ba00f..209b81e12d 100644
--- a/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java
@@ -11,6 +11,7 @@ import net.sf.briar.util.StringUtils;
 
 public class TorPluginFactory implements DuplexPluginFactory {
 
+	private static final long MAX_LATENCY = 5L * 60L * 1000L; // 5 minutes
 	private static final long POLLING_INTERVAL = 15L * 60L * 1000L; // 15 mins
 
 	private final Executor pluginExecutor;
@@ -27,6 +28,7 @@ public class TorPluginFactory implements DuplexPluginFactory {
 		// This plugin is not enabled by default
 		String enabled = callback.getConfig().get("enabled");
 		if(StringUtils.isNullOrEmpty(enabled)) return null;
-		return new TorPlugin(pluginExecutor, callback, POLLING_INTERVAL);
+		return new TorPlugin(pluginExecutor, callback, MAX_LATENCY,
+				POLLING_INTERVAL);
 	}
 }
diff --git a/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java b/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java
index 402b9509f1..c01cf4fe1b 100644
--- a/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java
@@ -26,7 +26,8 @@ public class BluetoothClientTest extends DuplexClientTest {
 		// Create the plugin
 		callback = new ClientCallback(new TransportConfig(),
 				new TransportProperties(), remote);
-		plugin = new BluetoothPlugin(executor, new SystemClock(), callback, 0L);
+		plugin = new BluetoothPlugin(executor, new SystemClock(), callback, 0L,
+				0L);
 	}
 
 	public static void main(String[] args) throws Exception {
diff --git a/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java b/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java
index d59dda8f59..8dbe021c50 100644
--- a/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java
@@ -21,7 +21,8 @@ public class BluetoothServerTest extends DuplexServerTest {
 		// Create the plugin
 		callback = new ServerCallback(new TransportConfig(), local,
 				Collections.singletonMap(contactId, new TransportProperties()));
-		plugin = new BluetoothPlugin(executor, new SystemClock(), callback, 0L);
+		plugin = new BluetoothPlugin(executor, new SystemClock(), callback, 0L,
+				0L);
 	}
 
 	public static void main(String[] args) throws Exception {
diff --git a/briar-tests/src/net/sf/briar/plugins/file/RemovableDrivePluginTest.java b/briar-tests/src/net/sf/briar/plugins/file/RemovableDrivePluginTest.java
index f7cbe893be..ba81586efe 100644
--- a/briar-tests/src/net/sf/briar/plugins/file/RemovableDrivePluginTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/file/RemovableDrivePluginTest.java
@@ -54,7 +54,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		assertNull(plugin.createWriter(contactId));
@@ -89,7 +89,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		assertNull(plugin.createWriter(contactId));
@@ -126,7 +126,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		assertNull(plugin.createWriter(contactId));
@@ -165,7 +165,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		assertNull(plugin.createWriter(contactId));
@@ -204,7 +204,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		assertNotNull(plugin.createWriter(contactId));
@@ -247,7 +247,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		SimplexTransportWriter writer = plugin.createWriter(contactId);
@@ -286,7 +286,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 		plugin.start();
 
 		plugin.driveInserted(testDir);
@@ -306,7 +306,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 			context.mock(RemovableDriveMonitor.class);
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(executor,
-				callback, finder, monitor);
+				callback, finder, monitor, 0L);
 
 		assertFalse(plugin.isPossibleConnectionFilename("abcdefg.dat"));
 		assertFalse(plugin.isPossibleConnectionFilename("abcdefghi.dat"));
@@ -334,7 +334,7 @@ public class RemovableDrivePluginTest extends BriarTestCase {
 		}});
 
 		RemovableDrivePlugin plugin = new RemovableDrivePlugin(
-				new ImmediateExecutor(), callback, finder, monitor);
+				new ImmediateExecutor(), callback, finder, monitor, 0L);
 		plugin.start();
 
 		File f = new File(testDir, "abcdefgh.dat");
diff --git a/briar-tests/src/net/sf/briar/plugins/modem/ModemPluginTest.java b/briar-tests/src/net/sf/briar/plugins/modem/ModemPluginTest.java
index 3de474d35c..aae603511f 100644
--- a/briar-tests/src/net/sf/briar/plugins/modem/ModemPluginTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/modem/ModemPluginTest.java
@@ -37,7 +37,7 @@ public class ModemPluginTest extends BriarTestCase {
 		final SerialPortList serialPortList =
 				context.mock(SerialPortList.class);
 		final ModemPlugin plugin = new ModemPlugin(null, modemFactory,
-				serialPortList, null, 0L, true);
+				serialPortList, null, 0L, 0L, true);
 		final Modem modem = context.mock(Modem.class);
 		context.checking(new Expectations() {{
 			oneOf(serialPortList).getPortNames();
@@ -71,7 +71,7 @@ public class ModemPluginTest extends BriarTestCase {
 		final DuplexPluginCallback callback =
 				context.mock(DuplexPluginCallback.class);
 		final ModemPlugin plugin = new ModemPlugin(null, modemFactory,
-				serialPortList, callback, 0L, true);
+				serialPortList, callback, 0L, 0L, true);
 		final Modem modem = context.mock(Modem.class);
 		final TransportProperties local = new TransportProperties();
 		local.put("iso3166", ISO_1336);
@@ -112,7 +112,7 @@ public class ModemPluginTest extends BriarTestCase {
 		final DuplexPluginCallback callback =
 				context.mock(DuplexPluginCallback.class);
 		final ModemPlugin plugin = new ModemPlugin(null, modemFactory,
-				serialPortList, callback, 0L, true);
+				serialPortList, callback, 0L, 0L, true);
 		final Modem modem = context.mock(Modem.class);
 		final TransportProperties local = new TransportProperties();
 		local.put("iso3166", ISO_1336);
@@ -153,7 +153,7 @@ public class ModemPluginTest extends BriarTestCase {
 		final DuplexPluginCallback callback =
 				context.mock(DuplexPluginCallback.class);
 		final ModemPlugin plugin = new ModemPlugin(null, modemFactory,
-				serialPortList, callback, 0L, true);
+				serialPortList, callback, 0L, 0L, true);
 		final Modem modem = context.mock(Modem.class);
 		final TransportProperties local = new TransportProperties();
 		local.put("iso3166", ISO_1336);
@@ -204,7 +204,7 @@ public class ModemPluginTest extends BriarTestCase {
 				context.mock(DuplexPluginCallback.class);
 		// Disable shuffling for this test, it confuses jMock
 		final ModemPlugin plugin = new ModemPlugin(pluginExecutor, modemFactory,
-				serialPortList, callback, 0L, false);
+				serialPortList, callback, 0L, 0L, false);
 		final Modem modem = context.mock(Modem.class);
 		final TransportProperties local = new TransportProperties();
 		local.put("iso3166", ISO_1336);
diff --git a/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpClientTest.java b/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpClientTest.java
index 410339be78..c3ba14c384 100644
--- a/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpClientTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpClientTest.java
@@ -27,7 +27,7 @@ public class LanTcpClientTest extends DuplexClientTest {
 		// Create the plugin
 		callback = new ClientCallback(new TransportConfig(),
 				new TransportProperties(), remote);
-		plugin = new LanTcpPlugin(executor, new SystemClock(), callback, 0L);
+		plugin = new LanTcpPlugin(executor, new SystemClock(), callback, 0, 0);
 	}
 
 	public static void main(String[] args) throws Exception {
diff --git a/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpPluginTest.java b/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpPluginTest.java
index bc4f264494..80d6eec797 100644
--- a/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpPluginTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpPluginTest.java
@@ -36,7 +36,7 @@ public class LanTcpPluginTest extends BriarTestCase {
 		callback.local.put("port", "0");
 		Executor executor = Executors.newCachedThreadPool();
 		Clock clock = new SystemClock();
-		DuplexPlugin plugin = new LanTcpPlugin(executor, clock, callback, 0L);
+		DuplexPlugin plugin = new LanTcpPlugin(executor, clock, callback, 0, 0);
 		plugin.start();
 		// The plugin should have bound a socket and stored the port number
 		assertTrue(callback.propertiesLatch.await(5, SECONDS));
@@ -62,7 +62,7 @@ public class LanTcpPluginTest extends BriarTestCase {
 		Callback callback = new Callback();
 		Executor executor = Executors.newCachedThreadPool();
 		Clock clock = new SystemClock();
-		DuplexPlugin plugin = new LanTcpPlugin(executor, clock, callback, 0L);
+		DuplexPlugin plugin = new LanTcpPlugin(executor, clock, callback, 0, 0);
 		plugin.start();
 		// Listen on a local port
 		final ServerSocket ss = new ServerSocket();
diff --git a/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpServerTest.java b/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpServerTest.java
index 462cfbdf79..f62573d84c 100644
--- a/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpServerTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/tcp/LanTcpServerTest.java
@@ -18,7 +18,7 @@ public class LanTcpServerTest extends DuplexServerTest {
 		callback = new ServerCallback(new TransportConfig(),
 				new TransportProperties(),
 				Collections.singletonMap(contactId, new TransportProperties()));
-		plugin = new LanTcpPlugin(executor, new SystemClock(), callback, 0L);
+		plugin = new LanTcpPlugin(executor, new SystemClock(), callback, 0, 0);
 	}
 
 	public static void main(String[] args) throws Exception {
diff --git a/briar-tests/src/net/sf/briar/plugins/tor/TorPluginTest.java b/briar-tests/src/net/sf/briar/plugins/tor/TorPluginTest.java
index c217e6605c..71b7e87bb0 100644
--- a/briar-tests/src/net/sf/briar/plugins/tor/TorPluginTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/tor/TorPluginTest.java
@@ -31,7 +31,7 @@ public class TorPluginTest extends BriarTestCase {
 		try {
 			// Create a plugin instance for the server
 			Callback serverCallback = new Callback();
-			serverPlugin = new TorPlugin(e, serverCallback, 0L);
+			serverPlugin = new TorPlugin(e, serverCallback, 0, 0);
 			System.out.println("Starting server plugin");
 			serverPlugin.start();
 			// The plugin should create a hidden service... eventually
@@ -46,7 +46,7 @@ public class TorPluginTest extends BriarTestCase {
 			TransportProperties p = new TransportProperties();
 			p.put("onion", onion);
 			clientCallback.remote.put(contactId, p);
-			clientPlugin = new TorPlugin(e, clientCallback, 0L);
+			clientPlugin = new TorPlugin(e, clientCallback, 0, 0);
 			System.out.println("Starting client plugin");
 			clientPlugin.start();
 			// The plugin should start without creating a hidden service
@@ -87,7 +87,7 @@ public class TorPluginTest extends BriarTestCase {
 		try {
 			// Start a plugin instance with no private key
 			Callback callback = new Callback();
-			plugin = new TorPlugin(e, callback, 0L);
+			plugin = new TorPlugin(e, callback, 0, 0);
 			System.out.println("Starting plugin without private key");
 			plugin.start();
 			// The plugin should create a hidden service... eventually
@@ -106,7 +106,7 @@ public class TorPluginTest extends BriarTestCase {
 			// Start another instance, reusing the private key
 			callback = new Callback();
 			callback.config.put("privateKey", privateKey);
-			plugin = new TorPlugin(e, callback, 0L);
+			plugin = new TorPlugin(e, callback, 0, 0);
 			System.out.println("Starting plugin with private key");
 			plugin.start();
 			// The plugin should create a hidden service... eventually
-- 
GitLab