From f4f28023fa64e085a408f3628465138020bd201d Mon Sep 17 00:00:00 2001 From: "Kristian S. Stangeland" Date: Mon, 1 Oct 2012 06:04:31 +0200 Subject: [PATCH] Always create the NullPacketListener (unless otherwise stated). This functions like a crude "counter" that automatically unregisters the packet injectors when every asynchronous listener has been removed. --- .../protocol/AsynchronousManager.java | 1 - .../protocol/async/AsyncFilterManager.java | 33 ++++++++++--------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/ProtocolLib/src/com/comphenix/protocol/AsynchronousManager.java b/ProtocolLib/src/com/comphenix/protocol/AsynchronousManager.java index eca8466a..55d75f99 100644 --- a/ProtocolLib/src/com/comphenix/protocol/AsynchronousManager.java +++ b/ProtocolLib/src/com/comphenix/protocol/AsynchronousManager.java @@ -20,7 +20,6 @@ public interface AsynchronousManager { * Registers an asynchronous packet handler. *

* To start listening asynchronously, pass the getListenerLoop() runnable to a different thread. - * @param plugin - the plugin that is registering the handler. * @param listener - the packet listener that will recieve these asynchronous events. * @return An asynchrouns handler. */ diff --git a/ProtocolLib/src/com/comphenix/protocol/async/AsyncFilterManager.java b/ProtocolLib/src/com/comphenix/protocol/async/AsyncFilterManager.java index 0862bed4..9e6e6886 100644 --- a/ProtocolLib/src/com/comphenix/protocol/async/AsyncFilterManager.java +++ b/ProtocolLib/src/com/comphenix/protocol/async/AsyncFilterManager.java @@ -68,28 +68,40 @@ public class AsyncFilterManager implements AsynchronousManager { @Override public AsyncListenerHandler registerAsyncHandler(PacketListener listener) { + return registerAsyncHandler(listener, true); + } + + /** + * Registers an asynchronous packet handler. + *

+ * To start listening asynchronously, pass the getListenerLoop() runnable to a different thread. + *

+ * Asynchronous events will only be executed if a synchronous listener with the same packets is registered. + * If you already have a synchronous event, call this method with autoInject set to FALSE. + * + * @param listener - the packet listener that will recieve these asynchronous events. + * @param autoInject - whether or not to automatically create the corresponding synchronous listener, + * @return An asynchrouns handler. + */ + public AsyncListenerHandler registerAsyncHandler(PacketListener listener, boolean autoInject) { AsyncListenerHandler handler = new AsyncListenerHandler(mainThread, this, listener); ListeningWhitelist sendingWhitelist = listener.getSendingWhitelist(); ListeningWhitelist receivingWhitelist = listener.getReceivingWhitelist(); - // We need a synchronized listener to get the ball rolling - boolean hasListener = true; - // Add listener to either or both processing queue if (hasValidWhitelist(sendingWhitelist)) { PacketFilterManager.verifyWhitelist(listener, sendingWhitelist); serverProcessingQueue.addListener(handler, sendingWhitelist); - hasListener &= hasPacketListener(sendingWhitelist); } if (hasValidWhitelist(receivingWhitelist)) { PacketFilterManager.verifyWhitelist(listener, receivingWhitelist); clientProcessingQueue.addListener(handler, receivingWhitelist); - hasListener &= hasPacketListener(receivingWhitelist); } - if (!hasListener) { + // We need a synchronized listener to get the ball rolling + if (autoInject) { handler.setNullPacketListener(new NullPacketListener(listener)); manager.addPacketListener(handler.getNullPacketListener()); } @@ -97,15 +109,6 @@ public class AsyncFilterManager implements AsynchronousManager { return handler; } - /** - * Determine if the given packets are represented. - * @param whitelist - list of packets. - * @return TRUE if they are all registered, FALSE otherwise. - */ - private boolean hasPacketListener(ListeningWhitelist whitelist) { - return manager.getSendingFilters().containsAll(whitelist.getWhitelist()); - } - private boolean hasValidWhitelist(ListeningWhitelist whitelist) { return whitelist != null && whitelist.getWhitelist().size() > 0; }