diff --git a/src/intents/network/InboundUdpPacketIntent.java b/src/intents/network/InboundUdpPacketIntent.java deleted file mode 100644 index a40121d97..000000000 --- a/src/intents/network/InboundUdpPacketIntent.java +++ /dev/null @@ -1,63 +0,0 @@ -/*********************************************************************************** -* Copyright (c) 2015 /// Project SWG /// www.projectswg.com * -* * -* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * -* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * -* Our goal is to create an emulator which will provide a server for players to * -* continue playing a game similar to the one they used to play. We are basing * -* it on the final publish of the game prior to end-game events. * -* * -* This file is part of Holocore. * -* * -* -------------------------------------------------------------------------------- * -* * -* Holocore is free software: you can redistribute it and/or modify * -* it under the terms of the GNU Affero General Public License as * -* published by the Free Software Foundation, either version 3 of the * -* License, or (at your option) any later version. * -* * -* Holocore is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU Affero General Public License for more details. * -* * -* You should have received a copy of the GNU Affero General Public License * -* along with Holocore. If not, see . * -* * -***********************************************************************************/ -package intents.network; - -import resources.control.Intent; -import resources.network.ServerType; -import resources.network.UDPServer.UDPPacket; - -public class InboundUdpPacketIntent extends Intent { - - public static final String TYPE = "InboundUdpPacketIntent"; - - private UDPPacket packet; - private ServerType type; - - public InboundUdpPacketIntent(ServerType type, UDPPacket p) { - super(TYPE); - setPacket(p); - setServerType(type); - } - - public void setPacket(UDPPacket p) { - this.packet = p; - } - - public void setServerType(ServerType type) { - this.type = type; - } - - public UDPPacket getPacket() { - return packet; - } - - public ServerType getServerType() { - return type; - } - -} diff --git a/src/intents/network/OutboundUdpPacketIntent.java b/src/intents/network/OutboundUdpPacketIntent.java deleted file mode 100644 index d1a683770..000000000 --- a/src/intents/network/OutboundUdpPacketIntent.java +++ /dev/null @@ -1,63 +0,0 @@ -/*********************************************************************************** -* Copyright (c) 2015 /// Project SWG /// www.projectswg.com * -* * -* ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on * -* July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. * -* Our goal is to create an emulator which will provide a server for players to * -* continue playing a game similar to the one they used to play. We are basing * -* it on the final publish of the game prior to end-game events. * -* * -* This file is part of Holocore. * -* * -* -------------------------------------------------------------------------------- * -* * -* Holocore is free software: you can redistribute it and/or modify * -* it under the terms of the GNU Affero General Public License as * -* published by the Free Software Foundation, either version 3 of the * -* License, or (at your option) any later version. * -* * -* Holocore is distributed in the hope that it will be useful, * -* but WITHOUT ANY WARRANTY; without even the implied warranty of * -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * -* GNU Affero General Public License for more details. * -* * -* You should have received a copy of the GNU Affero General Public License * -* along with Holocore. If not, see . * -* * -***********************************************************************************/ -package intents.network; - -import resources.control.Intent; -import resources.network.ServerType; -import resources.network.UDPServer.UDPPacket; - -public class OutboundUdpPacketIntent extends Intent { - - public static final String TYPE = "OutboundUdpPacketIntent"; - - private UDPPacket packet; - private ServerType type; - - public OutboundUdpPacketIntent(ServerType type, UDPPacket p) { - super(TYPE); - setPacket(p); - setServerType(type); - } - - public void setPacket(UDPPacket p) { - this.packet = p; - } - - public void setServerType(ServerType type) { - this.type = type; - } - - public UDPPacket getPacket() { - return packet; - } - - public ServerType getServerType() { - return type; - } - -} diff --git a/src/network/NetworkClient.java b/src/network/NetworkClient.java index e95c7e0a5..7102e85f6 100644 --- a/src/network/NetworkClient.java +++ b/src/network/NetworkClient.java @@ -47,10 +47,10 @@ public class NetworkClient { private int port; private int connId; - public NetworkClient(ServerType type, InetAddress addr, int port, long networkId) { + public NetworkClient(ServerType type, InetAddress addr, int port, long networkId, PacketSender packetSender) { this.serverType = type; this.networkId = networkId; - protocol = new NetworkProtocol(type, addr, port); + protocol = new NetworkProtocol(type, addr, port, packetSender); prevPacketIntent = null; connId = 0; updateNetworkInfo(addr, port); diff --git a/src/network/NetworkProtocol.java b/src/network/NetworkProtocol.java index 680fed210..afdcd2c33 100644 --- a/src/network/NetworkProtocol.java +++ b/src/network/NetworkProtocol.java @@ -27,13 +27,10 @@ ***********************************************************************************/ package network; -import intents.network.OutboundUdpPacketIntent; - import java.net.InetAddress; import java.util.LinkedList; import java.util.List; -import resources.control.Intent; import resources.network.ServerType; import resources.network.UDPServer.UDPPacket; import resources.server_info.Log; @@ -46,21 +43,20 @@ import network.packets.soe.ServerNetworkStatusUpdate; public class NetworkProtocol implements InboundEventCallback { - private final Object prevOutboundIntentMutex = new Object(); private final InboundNetworkHandler inbound; private final OutboundNetworkHandler outbound; private final ServerType serverType; + private final PacketSender packetSender; - private Intent prevOutboundIntent; private InetAddress address; private int port; private int crc; - public NetworkProtocol(ServerType type, InetAddress address, int port) { + public NetworkProtocol(ServerType type, InetAddress address, int port, PacketSender packetSender) { this.inbound = new InboundNetworkHandler(this); this.outbound = new OutboundNetworkHandler(); this.serverType = type; - prevOutboundIntent = null; + this.packetSender = packetSender; crc = 0; updateNetworkInfo(address, port); } @@ -93,7 +89,6 @@ public class NetworkProtocol implements InboundEventCallback { public void resetNetwork() { inbound.reset(); outbound.reset(); - prevOutboundIntent = null; } public List process(byte [] data) { @@ -129,12 +124,7 @@ public class NetworkProtocol implements InboundEventCallback { private void send(byte [] data) { if (data == null) throw new NullPointerException("Outbound data cannot be null!"); - UDPPacket packet = new UDPPacket(address, port, data); - OutboundUdpPacketIntent intent = new OutboundUdpPacketIntent(serverType, packet); - synchronized (prevOutboundIntentMutex) { - intent.broadcastAfterIntent(prevOutboundIntent); - prevOutboundIntent = intent; - } + packetSender.sendPacket(serverType, new UDPPacket(address, port, data)); } private void processClientNetworkUpdate(ClientNetworkStatusUpdate update) { diff --git a/src/network/PacketReceiver.java b/src/network/PacketReceiver.java new file mode 100644 index 000000000..f0d8852f6 --- /dev/null +++ b/src/network/PacketReceiver.java @@ -0,0 +1,10 @@ +package network; + +import resources.network.ServerType; +import resources.network.UDPServer.UDPPacket; + +public interface PacketReceiver { + + void receivePacket(ServerType type, UDPPacket packet); + +} diff --git a/src/network/PacketSender.java b/src/network/PacketSender.java new file mode 100644 index 000000000..8fc8dac23 --- /dev/null +++ b/src/network/PacketSender.java @@ -0,0 +1,10 @@ +package network; + +import resources.network.ServerType; +import resources.network.UDPServer.UDPPacket; + +public interface PacketSender { + + void sendPacket(ServerType type, UDPPacket packet); + +} diff --git a/src/services/network/NetworkClientManager.java b/src/services/network/NetworkClientManager.java index d7252cf1a..548ef21d1 100644 --- a/src/services/network/NetworkClientManager.java +++ b/src/services/network/NetworkClientManager.java @@ -29,7 +29,6 @@ package services.network; import intents.network.CloseConnectionIntent; import intents.network.InboundPacketIntent; -import intents.network.InboundUdpPacketIntent; import intents.network.OutboundPacketIntent; import java.net.InetAddress; @@ -41,6 +40,8 @@ import java.util.Map; import java.util.Random; import network.NetworkClient; +import network.PacketReceiver; +import network.PacketSender; import network.packets.Packet; import network.packets.soe.Disconnect; import network.packets.soe.SessionRequest; @@ -52,14 +53,16 @@ import resources.control.Manager; import resources.network.ServerType; import resources.network.UDPServer.UDPPacket; -public class NetworkClientManager extends Manager { +public class NetworkClientManager extends Manager implements PacketReceiver { private final Map > clients; private final Map networkClients; private final Random crcGenerator; + private final PacketSender packetSender; private long networkId; - public NetworkClientManager() { + public NetworkClientManager(PacketSender packetSender) { + this.packetSender = packetSender; clients = new HashMap>(); networkClients = new HashMap(); crcGenerator = new Random(); @@ -68,7 +71,6 @@ public class NetworkClientManager extends Manager { @Override public boolean initialize() { - registerForIntent(InboundUdpPacketIntent.TYPE); registerForIntent(InboundPacketIntent.TYPE); registerForIntent(OutboundPacketIntent.TYPE); registerForIntent(CloseConnectionIntent.TYPE); @@ -83,14 +85,14 @@ public class NetworkClientManager extends Manager { return super.stop(); } + @Override + public void receivePacket(ServerType type, UDPPacket packet) { + handlePacket(type, packet); + } + + @Override public void onIntentReceived(Intent i) { - if (i instanceof InboundUdpPacketIntent) { - InboundUdpPacketIntent inbound = (InboundUdpPacketIntent) i; - UDPPacket p = inbound.getPacket(); - if (p != null) { - handlePacket(inbound.getServerType(), p); - } - } else if (i instanceof OutboundPacketIntent) { + if (i instanceof OutboundPacketIntent) { Packet p = ((OutboundPacketIntent)i).getPacket(); if (p != null) handleOutboundPacket(((OutboundPacketIntent) i).getNetworkId(), p); @@ -204,7 +206,7 @@ public class NetworkClientManager extends Manager { private NetworkClient createClient(ServerType type, InetAddress addr, int port) { synchronized (clients) { - NetworkClient client = new NetworkClient(type, addr, port, networkId++); + NetworkClient client = new NetworkClient(type, addr, port, networkId++, packetSender); List ipList = clients.get(addr); if (ipList == null) { ipList = new ArrayList(); diff --git a/src/services/network/NetworkListenerService.java b/src/services/network/NetworkListenerService.java index 7b28ad5f3..0a8cd5c87 100644 --- a/src/services/network/NetworkListenerService.java +++ b/src/services/network/NetworkListenerService.java @@ -27,14 +27,13 @@ ***********************************************************************************/ package services.network; -import intents.network.InboundUdpPacketIntent; - import java.net.InetAddress; import java.net.UnknownHostException; +import network.PacketReceiver; +import network.PacketSender; import resources.Galaxy; import resources.config.ConfigFile; -import resources.control.Intent; import resources.control.Service; import resources.network.ServerType; import resources.network.UDPServer; @@ -42,7 +41,7 @@ import resources.network.UDPServer.UDPCallback; import resources.network.UDPServer.UDPPacket; import resources.server_info.Config; -public class NetworkListenerService extends Service { +public class NetworkListenerService extends Service implements PacketSender { private Server login; private Server zone; @@ -56,6 +55,12 @@ public class NetworkListenerService extends Service { ping = new Server(ServerType.PING); } + public void setPacketReceiver(PacketReceiver packetReceiver) { + login.setPacketReceiver(packetReceiver); + zone.setPacketReceiver(packetReceiver); + ping.setPacketReceiver(packetReceiver); + } + private InetAddress getBindAddr(Config c, String firstTry, String secondTry) { String t = firstTry; try { @@ -113,6 +118,11 @@ public class NetworkListenerService extends Service { return true; } + @Override + public void sendPacket(ServerType type, UDPPacket packet) { + send(type, packet.getAddress(), packet.getPort(), packet.getData()); + } + public void send(ServerType type, InetAddress addr, int port, byte [] data) { switch (type) { case LOGIN: @@ -128,14 +138,17 @@ public class NetworkListenerService extends Service { } private class Server implements UDPCallback { - + private final ServerType type; + private PacketReceiver packetReceiver; private UDPServer server; - private Intent prevIntent; public Server(ServerType type) { this.type = type; - this.prevIntent = null; + } + + public void setPacketReceiver(PacketReceiver packetReceiver) { + this.packetReceiver = packetReceiver; } public boolean initialize(InetAddress bindAddr, int port, int maxPacket) { @@ -178,11 +191,8 @@ public class NetworkListenerService extends Service { public void onReceivedPacket(UDPPacket packet) { if (type == ServerType.PING) send(packet.getAddress(), packet.getPort(), packet.getData()); - else { - InboundUdpPacketIntent i = new InboundUdpPacketIntent(type, packet); - i.broadcastAfterIntent(prevIntent); - prevIntent = i; - } + else + packetReceiver.receivePacket(type, packet); } } diff --git a/src/services/network/NetworkManager.java b/src/services/network/NetworkManager.java index d722cdeae..160a0fa41 100644 --- a/src/services/network/NetworkManager.java +++ b/src/services/network/NetworkManager.java @@ -27,12 +27,8 @@ ***********************************************************************************/ package services.network; -import intents.network.OutboundUdpPacketIntent; import resources.Galaxy; -import resources.control.Intent; import resources.control.Manager; -import resources.network.ServerType; -import resources.network.UDPServer.UDPPacket; public class NetworkManager extends Manager { @@ -41,25 +37,11 @@ public class NetworkManager extends Manager { public NetworkManager(Galaxy galaxy) { netListenerService = new NetworkListenerService(galaxy); - netClientManager = new NetworkClientManager(); + netClientManager = new NetworkClientManager(netListenerService); + netListenerService.setPacketReceiver(netClientManager); addChildService(netClientManager); addChildService(netListenerService); } - @Override - public boolean initialize() { - registerForIntent(OutboundUdpPacketIntent.TYPE); - return super.initialize(); - } - - @Override - public void onIntentReceived(Intent i) { - if (i instanceof OutboundUdpPacketIntent) { - UDPPacket packet = ((OutboundUdpPacketIntent) i).getPacket(); - ServerType type = ((OutboundUdpPacketIntent) i).getServerType(); - netListenerService.send(type, packet.getAddress(), packet.getPort(), packet.getData()); - } - } - }