package gate; import com.google.protobuf.Message; import gate.handler.GateAuthConnectionHandler; import gate.handler.GateLogicConnectionHandler; import gate.utils.ClientConnection; import gate.utils.ClientConnectionMap; import io.netty.buffer.ByteBuf; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import protobuf.Utils; import protobuf.analysis.ParseMap; import protobuf.generate.cli2srv.chat.Chat; import protobuf.generate.cli2srv.login.Auth; import protobuf.generate.internal.Internal; import java.io.IOException; import java.util.HashMap; /** * Created by Dell on 2016/2/2. */ public class ClientMessage { private static final Logger logger = LoggerFactory.getLogger(ClientMessage.class); public static HashMap<Integer, Transfer> tranferHandlerMap = new HashMap<>(); public static HashMap<Class<?>, Integer> msg2ptoNum = new HashMap<>(); @FunctionalInterface public interface Transfer{ void process(Message msg, ClientConnection conn) throws IOException; } public static void registerTranferHandler(Integer ptoNum, Transfer tranfer, Class<?> cla) { if (tranferHandlerMap.get(ptoNum) == null) tranferHandlerMap.put(ptoNum, tranfer); else { logger.error("pto has been registered in transeerHandlerMap, ptoNum: {}", ptoNum); return; } if(msg2ptoNum.get(cla) == null) msg2ptoNum.put(cla, ptoNum); else { logger.error("pto has been registered in msg2ptoNum, ptoNum: {}", ptoNum); return; } } public static void processTransferHandler(Message msg, ClientConnection conn) throws IOException { logger.info("MessageName {}", msg.getClass()); int ptoNum = msg2ptoNum.get(msg.getClass()); Transfer transferHandler = tranferHandlerMap.get(ptoNum); if(transferHandler != null) { transferHandler.process(msg, conn); } } public static void transfer2Logic(Message msg, ClientConnection conn) { ByteBuf byteBuf = null; if(conn.getUserId() == null ) { logger.error("User not login."); return; } if(msg instanceof Chat.CPrivateChat) { byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Logic, conn.getUserId()); } GateLogicConnectionHandler.getGatelogicConnection().writeAndFlush(byteBuf); } public static void transfer2Auth(Message msg, ClientConnection conn) { ByteBuf byteBuf = null; if(msg instanceof Auth.CLogin) { String userId = ((Auth.CLogin) msg).getUserid(); byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, userId); ClientConnectionMap.registerUserid(userId, conn.getNetId()); } else if(msg instanceof Auth.CRegister) { byteBuf = Utils.pack2Server(msg, ParseMap.getPtoNum(msg), conn.getNetId(), Internal.Dest.Auth, ((Auth.CRegister) msg).getUserid()); } GateAuthConnectionHandler.getGateAuthConnection().writeAndFlush(byteBuf); } }