int main(int argc, char* argv[])
{
	if (argc != 2)
	{
		std::cout << "USAGE: <Interfaces|Callbacks>" << std::endl;
		return EXIT_SUCCESS;
	}

	auto c = std::make_shared<int>(3);
	const int ciclesB = 1000000 * 5;
	const int ciclesC = 1000000 * 5;

	if (std::string("interfaces") == argv[1])
	{
		auto listener = std::make_shared<ConcreteListener>();
		auto generator = std::make_shared<AsyncGenerator>(listener);

		Timer.start();

		for (int i = 0; i < ciclesB; ++i)
		{
			generator->makeB(1);
		}
		for (int i = 0; i < ciclesC; ++i)
		{
			generator->makeC(c);
		}
		generator->makeB(0);

		Mutex.lock();
	}
	else if (std::string("callbacks") == argv[1])
	{
		auto generator = std::make_shared<CallbackGenerator>(ReceiverB, ReceiverC);

		Timer.start();

		for (int i = 0; i < ciclesB; ++i)
		{
			generator->makeB(1);
		}
		for (int i = 0; i < ciclesC; ++i)
		{
			generator->makeC(c);
		}
		generator->makeB(0);

		Mutex.lock();
	}

	std::cout << "ElapsedTime: " << boost::timer::format(ElapsedTime) << std::endl;
	std::cin.get();
	return EXIT_SUCCESS;
}
void cia_client::start()
{
	m_started_ = true;
	clients.push_back(shared_from_this());
	m_update_time.start();
	do_read_header();
	if (m_timeout_elapsed != 0)
	{
		do_timeout_check();
	}
	BOOST_LOG_SEV(cia_g_logger, Debug) << "新的客户端socket已经运行";
}
inline void cia_client::do_deal_request(boost::shared_ptr<chat_message> ch_msg)
{
	if (!ch_msg->parse_cia_mag()) {
		BOOST_LOG_SEV(cia_g_logger, Debug) << "报文转换失败, 本次请求不做处理";
		//m_chat_msg_queue.Put(ch_msg);
		return;
	}	
	if (ch_msg->m_procbuffer_msg.type() == CIA_LOGIN_REQUEST){
		BOOST_LOG_SEV(cia_g_logger, Debug) << "本次请求判断为登陆请求";
		do_deal_login_request(ch_msg);
	}
	else if (ch_msg->m_procbuffer_msg.type() == CIA_HEART_RESPONSE){
		//m_chat_msg_queue.Put(ch_msg);
		BOOST_LOG_SEV(cia_g_logger, AllEvent) << "本次请求判断为心跳回应, 已对客户端的最后连接时间做更新";
		m_update_time.start();
	}
	else if (ch_msg->m_procbuffer_msg.type() == CIA_CALL_REQUEST){
		//BOOST_LOG_SEV(cia_g_logger, Debug) << "本次请求判断为呼叫请求";
		do_deal_call_out_request(ch_msg);
	}
}
inline void cia_client::do_read_body(boost::shared_ptr<chat_message> ch_msg_)
{
	ptr self = shared_from_this();
	//BOOST_LOG_SEV(cia_g_logger, Debug) << "开始准备异步读取数据";	
	boost::asio::async_read(m_sock_,
		boost::asio::buffer(ch_msg_->body(), ch_msg_->body_length()),
		[this, self, ch_msg_](boost::system::error_code ec, std::size_t /*length*/)
	{
		if (!ec)
		{
			//BOOST_LOG_SEV(cia_g_logger, Debug) << "已读取新的消息体, 开始进行下一次读取";
			do_read_header();
			m_update_time.start();
			//BOOST_LOG_SEV(cia_g_logger, Debug) << "开始解析本次请求的消息体";
			do_deal_request(ch_msg_);
		}
		else
		{
			BOOST_LOG_SEV(cia_g_logger, Debug) << "接收新的数据出错, 已经关闭此socket, 错误码:" << ec;
			stop();
		}
	});
}
	/**
	* 每次呼叫完毕, 需要重置相关资源
	*
	*/
	void realseTrunk()
	{
		m_step = TRK_IDLE;
		m_callTime.start();
		m_call_out_param.reset();
	}
	void reset_trunk(boost::shared_ptr<cti_call_out_param> call_out_param_)
	{
		m_step = TRK_WAIT_CONNECT;
		m_call_out_param = call_out_param_;
		m_callTime.start();
	}