diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/com/isode/stroke/streamstack/WhitespacePingLayer.java | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/src/com/isode/stroke/streamstack/WhitespacePingLayer.java b/src/com/isode/stroke/streamstack/WhitespacePingLayer.java index 3a1805c..95da051 100644 --- a/src/com/isode/stroke/streamstack/WhitespacePingLayer.java +++ b/src/com/isode/stroke/streamstack/WhitespacePingLayer.java @@ -4,29 +4,58 @@ * See Documentation/Licenses/GPLv3.txt for more information. */ /* - * Copyright (c) 2011, Isode Limited, London, England. + * Copyright (c) 2011-2016, Isode Limited, London, England. * All rights reserved. */ package com.isode.stroke.streamstack; +import java.util.logging.Logger; + import com.isode.stroke.base.SafeByteArray; import com.isode.stroke.network.Timer; import com.isode.stroke.network.TimerFactory; +import com.isode.stroke.signals.SignalConnection; import com.isode.stroke.signals.Slot; public class WhitespacePingLayer extends StreamLayer { private static final int TIMEOUT_MILLISECONDS = 60000; + + private final Logger logger = Logger.getLogger(this.getClass().getName()); public WhitespacePingLayer(TimerFactory timerFactory) { isActive = false; timer = timerFactory.createTimer(TIMEOUT_MILLISECONDS); - timer.onTick.connect(new Slot() { + onTickConnection = timer.onTick.connect(new Slot() { public void call() { handleTimerTick(); } }); } + + @Override + protected void finalize() throws Throwable { + try { + destroy(); + } + finally { + super.finalize(); + } + } + + /** + * This replaces the C++ destructor. After calling this object should not be used again. + * If any methods are called after they may throw {@link NullPointerException} + */ + public void destroy() { + if (isActive && timer != null) { + logger.finer("WhitespacePingLayer still active at destruction"); + timer.stop(); + } + onTickConnection.disconnect(); + timer = null; + isActive = false; + } public void writeData(SafeByteArray data) { writeDataToChildLayer(data); @@ -37,6 +66,9 @@ public class WhitespacePingLayer extends StreamLayer { } private void handleTimerTick() { + if (timer == null) { + return; + } timer.stop(); writeDataToChildLayer(new SafeByteArray(" ")); timer.start(); @@ -58,4 +90,6 @@ public class WhitespacePingLayer extends StreamLayer { private boolean isActive; private Timer timer; + + private final SignalConnection onTickConnection; } |