gateway.h 1.74 KB
#pragma once

#include <common.h>
#include <proto_header.h>

class gateway_t
{
public:
	gateway_t(el::lib_tcp_peer_info_t* peer_fd_info);
	virtual ~gateway_t();

	el::lib_tcp_peer_info_t* fd_info;	

	void send_msg(CMD_ID cmd_id, google::protobuf::Message* msg, uint32_t seq, USER_ID uid);
	void send_msg_res(google::protobuf::Message* msg);
	int send_err(CMD_ID cmd_id, uint32_t ret, uint32_t seq, USER_ID uid);
};

#undef  BIND_PROTO_CMD
#undef  BIND_PROTO_CMD_NO_CB
#define BIND_PROTO_CMD(__cmd_id__, fun_name, proto_name)\
	static const CMD_ID lobby_gateway_##proto_name##_cmd = __cmd_id__
#define BIND_PROTO_CMD_NO_CB(__cmd_id__, fun_name, proto_name)\
	static const CMD_ID lobby_gateway_##proto_name##_cmd = __cmd_id__
#include <lobby_gateway_cmd.h>
#undef  BIND_PROTO_CMD 
#undef  BIND_PROTO_CMD_NO_CB

#define GATEWAY_MGR_MSG_HANDLE_FUN_PAR \
	el::lib_tcp_peer_info_t* fd_info, google::protobuf::Message* msg, gateway_t* gateway, USER_ID uid

DEF_MSG_HANDLE_FUN(gateway_mgr_t, GATEWAY_MGR)

class gateway_mgr_t
{
 public:
	gateway_mgr_t();
	virtual ~gateway_mgr_t();
 	std::map<int, gateway_t*> gateway_map;//key:fd, val:gateway_t*	
	void add_gateway(el::lib_tcp_peer_info_t* peer_fd_info);
	gateway_t* find(int fd);
	void del_fd_gateway(int fd);

	int on_recv(el::lib_tcp_peer_info_t* peer_fd_info, char* pdata, int len);
	proto_head_t proto_head;
	GATEWAY_MGR_MSG_MAP_T msg_map;
	void init_msg_map();
	void release_msg_map();
private:
#undef  BIND_PROTO_CMD
#undef  BIND_PROTO_CMD_NO_CB
#define BIND_PROTO_CMD(__cmd_id__, fun_name, proto_name)\
	int fun_name(GATEWAY_MGR_MSG_HANDLE_FUN_PAR)
#define BIND_PROTO_CMD_NO_CB(__cmd_id__, fun_name, proto_name)
#include <lobby_gateway_cmd.h>
#undef  BIND_PROTO_CMD
#undef  BIND_PROTO_CMD_NO_CB
};

extern gateway_mgr_t* g_gateway_mgr;