#include "stdafx.h"
#include "check_sync.h"
#include "check_async.h"
#include "mymonitor.h"

mymonitor::mymonitor(acl::connect_manager& manager, const acl::string& proto)
: connect_monitor(manager)
, proto_(proto)
{
}

mymonitor::~mymonitor(void)
{
}

//////////////////////////////////////////////////////////////////////////////
// 阻塞检测过程，运行在某一个子线程空间中

void mymonitor::sio_check(acl::check_client& checker,
	acl::socket_stream& conn)
{
	// 同步检测过程
	check_sync check;
	if (proto_ == "http")
		check.sio_check_http(checker, conn);
	else if (proto_ == "pop3")
		check.sio_check_pop3(checker, conn);
	else
	{
		printf("unknown protocol: %s\r\n", proto_.c_str());
		checker.set_alive(true);
	}
}

/////////////////////////////////////////////////////////////////////////////
// 非阻塞检测过程，运行在检测器线程的空间中

void mymonitor::nio_check(acl::check_client& checker,
	acl::aio_socket_stream& conn)
{
	// 创建异步检测对象
	check_async* callback = new check_async(checker);

	// 注册非阻塞 IO 处理过程的回调过程
	conn.add_close_callback(callback);
	conn.add_read_callback(callback);
	conn.add_timeout_callback(callback);

	int timeout = 10;

	// 异步读取一行数据，同时要求不保留 \r\n

	conn.gets(timeout);
}
