#include "stdafx.h"
#include "check_async.h"

check_async::check_async(acl::check_client& checker)
: checker_(checker)
{
}

check_async::~check_async(void)
{
}

bool check_async::read_callback(char* data, int len)
{
	// 因为 acl 的异步 IO 读到的数据肯定会在所读到的数据最后添加 \0，
	// 所以直接当字符串比较在此处是安全的

	if (strncasecmp(data, "+OK", 3) == 0)
	{
		// 发送 QUIT 命令
		checker_.get_conn().format("QUIT\r\n");

		// 将服务端连接置为存活状态
		checker_.set_alive(true);

		// 主动关闭该检测连接
		checker_.close();

		// 此处返回 true 或 false 都可以，因为上面已经主动要求关闭检测连接
		printf(">>> NIO_CHECK SERVER(%s) OK: %s, len: %d <<<\r\n",
			checker_.get_addr(), data, len);
		return true;
	}

	// 发送 QUIT 命令
	checker_.get_conn().format("QUIT\r\n");

	// 将服务端置为不可用状态
	checker_.set_alive(false);

	printf(">>> NIO_CHECK SERVER(%s) ERROR: %s, len: %d <<<\r\n",
		checker_.get_addr(), data, len);

	// 返回 false 通知框架自动关闭该连接
	return false;
}

bool check_async::timeout_callback()
{
	// 读超时，所以直接将连接置为不可用
	checker_.set_alive(false);

	// 返回 false 通过框架自动关闭该检测连接
	return false;
}

void check_async::close_callback()
{
	// 动态创建对象，需要动态删除
	delete this;
}
