From 1eddc7b6041678c47ae3e2e8e632419ae3b5e150 Mon Sep 17 00:00:00 2001 From: Alex Clayton Date: Tue, 15 Mar 2016 14:42:00 +0000 Subject: Add destroy method to WhitespacePingLayer. Add a destroy method to the WhitespacePingLayer to act like the destructor introduced in swiften patch 'Stop timer during clean up of WhitespacePingLayer' (f377207cb896679b4eab9f6773d9d071700852ad). Test-information: Unit tests still pass ok. Change-Id: I4fca19c3d3b5f120102727db10b046904da848a4 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; } -- cgit v0.10.2-6-g49f6