diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketClient.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketClient.java index ca7e88b..c940962 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketClient.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketClient.java @@ -5,6 +5,7 @@ import gearth.protocol.HMessage; import gearth.protocol.connection.*; import gearth.protocol.connection.proxy.nitro.NitroConstants; import gearth.protocol.connection.proxy.nitro.NitroProxyProvider; +import gearth.protocol.packethandler.nitro.NitroPacketHandler; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketServer.java b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketServer.java index b54b96c..86c5ad0 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketServer.java +++ b/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroWebsocketServer.java @@ -4,6 +4,7 @@ import gearth.protocol.HConnection; import gearth.protocol.HMessage; import gearth.protocol.connection.proxy.nitro.NitroConstants; import gearth.protocol.packethandler.PacketHandler; +import gearth.protocol.packethandler.nitro.NitroPacketHandler; import javax.websocket.*; import java.io.IOException; diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java index a0d2677..9748dd3 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/PacketHandler.java @@ -32,4 +32,15 @@ public abstract class PacketHandler { message.getPacket().resetReadIndex(); } + protected void awaitListeners(HMessage message, PacketSender packetSender) { + notifyListeners(0, message); + notifyListeners(1, message); + extensionHandler.handle(message, message2 -> { + notifyListeners(2, message2); + if (!message2.isBlocked()) { + packetSender.send(message2); + } + }); + } + } diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/PacketSender.java b/G-Earth/src/main/java/gearth/protocol/packethandler/PacketSender.java new file mode 100644 index 0000000..62b69ac --- /dev/null +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/PacketSender.java @@ -0,0 +1,9 @@ +package gearth.protocol.packethandler; + +import gearth.protocol.HMessage; + +public interface PacketSender { + + void send(HMessage hMessage); + +} diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/flash/FlashPacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/flash/FlashPacketHandler.java index 018bca1..98b7ffe 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/flash/FlashPacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/flash/FlashPacketHandler.java @@ -8,7 +8,6 @@ import gearth.protocol.crypto.RC4; import gearth.protocol.packethandler.PacketHandler; import gearth.protocol.packethandler.PayloadBuffer; import gearth.services.extension_handler.ExtensionHandler; -import gearth.services.extension_handler.OnHMessageHandled; import java.io.IOException; import java.io.OutputStream; @@ -116,10 +115,14 @@ public abstract class FlashPacketHandler extends PacketHandler { } public boolean sendToStream(byte[] buffer) { + return sendToStream(buffer, isEncryptedStream); + } + + private boolean sendToStream(byte[] buffer, boolean isEncrypted) { synchronized (sendLock) { try { out.write( - (!isEncryptedStream) + (!isEncrypted) ? buffer : encryptcipher.rc4(buffer) ); @@ -139,29 +142,11 @@ public abstract class FlashPacketHandler extends PacketHandler { HMessage hMessage = new HMessage(hpacket, getMessageSide(), currentIndex); boolean isencrypted = isEncryptedStream; - OnHMessageHandled afterExtensionIntercept = hMessage1 -> { - if (isDataStream) { - notifyListeners(2, hMessage1); - } - - if (!hMessage1.isBlocked()) { - synchronized (sendLock) { - out.write( - (!isencrypted) - ? hMessage1.getPacket().toBytes() - : encryptcipher.rc4(hMessage1.getPacket().toBytes()) - ); - } - } - }; - if (isDataStream) { - notifyListeners(0, hMessage); - notifyListeners(1, hMessage); - extensionHandler.handle(hMessage, afterExtensionIntercept); + awaitListeners(hMessage, hMessage1 -> sendToStream(hMessage1.getPacket().toBytes(), isencrypted)); } else { - afterExtensionIntercept.finished(hMessage); + sendToStream(hMessage.getPacket().toBytes(), isencrypted); } currentIndex++; diff --git a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroPacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/nitro/NitroPacketHandler.java similarity index 68% rename from G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroPacketHandler.java rename to G-Earth/src/main/java/gearth/protocol/packethandler/nitro/NitroPacketHandler.java index 70ed0cb..d8b69b0 100644 --- a/G-Earth/src/main/java/gearth/protocol/connection/proxy/nitro/websocket/NitroPacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/nitro/NitroPacketHandler.java @@ -1,11 +1,11 @@ -package gearth.protocol.connection.proxy.nitro.websocket; +package gearth.protocol.packethandler.nitro; import gearth.protocol.HMessage; import gearth.protocol.HPacket; +import gearth.protocol.connection.proxy.nitro.websocket.NitroSession; import gearth.protocol.packethandler.PacketHandler; import gearth.protocol.packethandler.PayloadBuffer; import gearth.services.extension_handler.ExtensionHandler; -import gearth.services.extension_handler.OnHMessageHandled; import javax.websocket.Session; import java.io.IOException; @@ -18,7 +18,7 @@ public class NitroPacketHandler extends PacketHandler { private final PayloadBuffer payloadBuffer; private final Object payloadLock; - protected NitroPacketHandler(HMessage.Direction direction, NitroSession session, ExtensionHandler extensionHandler, Object[] trafficObservables) { + public NitroPacketHandler(HMessage.Direction direction, NitroSession session, ExtensionHandler extensionHandler, Object[] trafficObservables) { super(extensionHandler, trafficObservables); this.direction = direction; this.session = session; @@ -50,19 +50,7 @@ public class NitroPacketHandler extends PacketHandler { synchronized (payloadLock) { for (HPacket packet : payloadBuffer.receive()) { HMessage hMessage = new HMessage(packet, direction, currentIndex); - - OnHMessageHandled afterExtensionIntercept = hMessage1 -> { - notifyListeners(2, hMessage1); - - if (!hMessage1.isBlocked()) { - sendToStream(hMessage1.getPacket().toBytes()); - } - }; - - notifyListeners(0, hMessage); - notifyListeners(1, hMessage); - extensionHandler.handle(hMessage, afterExtensionIntercept); - + awaitListeners(hMessage, hMessage1 -> sendToStream(hMessage1.getPacket().toBytes())); currentIndex++; } } diff --git a/G-Earth/src/main/java/gearth/protocol/packethandler/unity/UnityPacketHandler.java b/G-Earth/src/main/java/gearth/protocol/packethandler/unity/UnityPacketHandler.java index 6bcca62..f85e55b 100644 --- a/G-Earth/src/main/java/gearth/protocol/packethandler/unity/UnityPacketHandler.java +++ b/G-Earth/src/main/java/gearth/protocol/packethandler/unity/UnityPacketHandler.java @@ -5,7 +5,6 @@ import gearth.protocol.HPacket; import gearth.protocol.packethandler.ByteArrayUtils; import gearth.protocol.packethandler.PacketHandler; import gearth.services.extension_handler.ExtensionHandler; -import gearth.services.extension_handler.OnHMessageHandled; import javax.websocket.Session; import java.io.IOException; @@ -34,19 +33,7 @@ public class UnityPacketHandler extends PacketHandler { @Override public void act(byte[] buffer) throws IOException { HMessage hMessage = new HMessage(new HPacket(buffer), direction, currentIndex); - - OnHMessageHandled afterExtensionIntercept = hMessage1 -> { - notifyListeners(2, hMessage1); - - if (!hMessage1.isBlocked()) { - sendToStream(hMessage1.getPacket().toBytes()); - } - }; - - notifyListeners(0, hMessage); - notifyListeners(1, hMessage); - extensionHandler.handle(hMessage, afterExtensionIntercept); - + awaitListeners(hMessage, hMessage1 -> sendToStream(hMessage1.getPacket().toBytes())); currentIndex++; } }