From 57824c6dbe4181abc8ef250027370b568f8a79ae Mon Sep 17 00:00:00 2001 From: lolodomo Date: Fri, 10 Apr 2020 20:20:37 +0200 Subject: [PATCH] [lgwebos] Avoid thing updates when the thing handler is already disposed (#7299) * [lgwebos] Avoid thing updates when the thing handler is already disposed * Change of state trigger for stopping the reconection job and starting the keep alive job Signed-off-by: Laurent Garnier --- .../lgwebos/internal/handler/LGWebOSHandler.java | 10 ++++++---- .../lgwebos/internal/handler/LGWebOSTVSocket.java | 15 ++++++++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSHandler.java b/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSHandler.java index 8a9d123ff1299..91051087151a1 100644 --- a/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSHandler.java +++ b/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSHandler.java @@ -150,7 +150,7 @@ public void dispose() { LGWebOSTVSocket s = socket; if (s != null) { s.setListener(null); - scheduler.execute(() -> s.disconnect()); // dispose should be none-blocking + s.disconnect(); } socket = null; config = null; // ensure config gets actually refreshed during re-initialization @@ -275,14 +275,15 @@ public void onStateChanged(LGWebOSTVSocket.State state) { stopKeepAliveJob(); startReconnectJob(); break; - - case REGISTERING: + case CONNECTING: stopReconnectJob(); - startKeepAliveJob(); + break; + case REGISTERING: updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Registering - You may need to confirm pairing on TV."); break; case REGISTERED: + startKeepAliveJob(); updateStatus(ThingStatus.ONLINE, ThingStatusDetail.NONE, "Connected"); channelHandlers.forEach((k, v) -> { @@ -307,6 +308,7 @@ public void onError(String error) { switch (getSocket().getState()) { case DISCONNECTED: break; + case CONNECTING: case REGISTERING: case REGISTERED: updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.COMMUNICATION_ERROR, "Connection Failed: " + error); diff --git a/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSTVSocket.java b/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSTVSocket.java index ac9b3f6fd2f72..30a4d87096db8 100644 --- a/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSTVSocket.java +++ b/bundles/org.openhab.binding.lgwebos/src/main/java/org/openhab/binding/lgwebos/internal/handler/LGWebOSTVSocket.java @@ -93,6 +93,7 @@ public class LGWebOSTVSocket { public enum State { DISCONNECTED, + CONNECTING, REGISTERING, REGISTERED } @@ -209,6 +210,8 @@ public void onClose(int statusCode, String reason) { * WebOS WebSocket API specific Communication */ void sendHello() { + setState(State.CONNECTING); + JsonObject packet = new JsonObject(); packet.addProperty("id", nextRequestId()); packet.addProperty("type", "hello"); @@ -293,9 +296,11 @@ public void sendCommand(ServiceCommand command) { this.sendMessage(packet); break; + case CONNECTING: case REGISTERING: case DISCONNECTED: - logger.warn("Skipping command {} for {} in state {}", command, command.getTarget(), state); + logger.warn("Skipping {} command {} for {} in state {}", command.getType(), command, + command.getTarget(), state); break; } @@ -393,6 +398,10 @@ public void onMessage(String message) { } break; case "hello": + if (state != State.CONNECTING) { + logger.debug("Skipping response {}, not in CONNECTING state, state was {}", message, state); + break; + } if (response.getPayload() == null) { logger.warn("No payload in error message: {}", message); break; @@ -408,6 +417,10 @@ public void onMessage(String message) { sendRegister(); break; case "registered": + if (state != State.REGISTERING) { + logger.debug("Skipping response {}, not in REGISTERING state, state was {}", message, state); + break; + } if (response.getPayload() == null) { logger.warn("No payload in registered message: {}", message); break;