/* * Created by Andrey Cherkashin (acherkashin) * http://acherkashin.me * * License * Copyright (c) 2015 Andrey Cherkashin * The project released under the MIT license: http://opensource.org/licenses/MIT */ package ragefist.packets; import com.juniform.JUniformMutableObject; import com.juniform.JUniformObject; import java.util.HashMap; import org.luaj.vm2.LuaValue; import ragefist.User; import ragefist.core.ProcessorTask; import ragefist.core.distribution.DistributedServerController.DistributedServerControllerAPI; import ragefist.core.distribution.DistributedServerPacketHandler; import ragefist.core.environment.EnvironmentRequestTask; import ragefist.core.network.Connection; import ragefist.core.util.FormatTools; import ragefist.packets.client.Request; /** * * @author acherkashin */ public class PacketHandlerClient extends DistributedServerPacketHandler { private final HashMap<Integer,Connection> _tasksWaitingResponseMap = new HashMap<>(); private final IncomingPacket.IncomingPacketBuilder _packetBuilder; public PacketHandlerClient(DistributedServerControllerAPI serverControllerAPI) { super(serverControllerAPI); _packetBuilder = new IncomingPacket.IncomingPacketBuilder(); _packetBuilder.packetHandler = this; } public Class<? extends IncomingPacket> getPacketClassForAction(String action) throws IncomingPacketException { switch(action) { default: return Request.class; } } @Override public void handleConnection(Connection connection) { User user = new User(); // Determine what Environment should be used for that user in that session user.setEnvironmentId( _serverControllerAPI.getSelectionPolicy().select( _serverControllerAPI.getEnvironmentCount() ) ); // Attach user connection.setAttachment(user); } @Override public void handlePacket(JUniformObject packet, Connection connection) { Integer sq = null; try { String action = packet.getProperty("action").toString(); if (action == null) { throw new IncomingPacketException("ERROR_UNKNOWN_ACTION"); } sq = packet.getProperty("sq").toInteger(); _packetBuilder.packet = packet; _packetBuilder.action = action; _packetBuilder.sq = sq; _packetBuilder.connection = connection; // CREATE A PACKET Class<? extends IncomingPacket> packetClass = getPacketClassForAction(action); IncomingPacket packetExecutor = _packetBuilder.build(packetClass); // EXECUTING packetExecutor.run(); } catch (IncomingPacketException ex) { JUniformMutableObject result = JUniformMutableObject.newMap(); result.setProperty("rs", 0); result.setProperty("error", ex.getCode()); if (this.getServerControllerAPI().isTestServer()) { result.setProperty("debug", ex.getMessage()); } if (sq != null) result.setProperty("sq", sq); connection.sendPacket(result); } } // ---------------------------------------------------------------------- // // IEnvironmentTaskDelegate // ---------------------------------------------------------------------- // @Override public void whenTaskIsFinished(ProcessorTask task) { EnvironmentRequestTask requestTask = (EnvironmentRequestTask)task; Connection connection = requestTask.getConnection(); if (connection.isClosed()) { return; } JUniformObject resp; if (task.getResult()) { resp = FormatTools.fromLuaToJUniformObject((LuaValue)task.getData()); } else { JUniformMutableObject respMutable = JUniformMutableObject.newMap(); respMutable.setProperty("rs", 0); if (task.getData() != null) { respMutable.setProperty("data", FormatTools.fromLuaToJUniformObject((LuaValue)task.getData())); } if (task.getError() != null) { respMutable.setProperty("error", task.getError()); } resp = respMutable; } connection.sendPacket(resp); } @Override public void whenIncomingPacketIsFinished(IncomingPacket packet, boolean status, Object responseData) { } }