#pragma once
#include "lib_acl.h"
#include "lib_protocol.h"  // http 协议相关
#include "acl_cpp/stream/ofstream.hpp"
#include "acl_cpp/http/http_service.hpp"

class acl::string;
class acl::aio_handle;

class CHttpDownload : public acl::http_service_request
{
public:
	CHttpDownload(const char* domain, unsigned short port,
		acl::aio_handle* handle);

#ifdef WIN32
	void SetHWnd(HWND hWnd);
#endif

	// 基类虚接口：销毁过程，由 http_service 类处理完毕后自动调用该回调
	virtual void destroy();

protected:
	~CHttpDownload(void);

	//////////////////////////////////////////////////////////////////////////
	// 基类虚接口

	// 获得HTTP请求的数据体时的回调接口，注意该函数的调用空间与其它函数不在同
	// 一个线程空间，所以如果该函数访问与其它函数相同的资源时需要注意互斥
	virtual const acl::string* get_body();
	// 正常读到 HTTP 响应头时的回调接口
	virtual void on_hdr(const char* addr, const HTTP_HDR_RES* hdr);
	// 正常读 HTTP 响应体时的回调函数
	virtual void on_body(const char* data, size_t dlen);
	// 当请求或响应失败时的回调函数
	virtual void on_error(acl::http_status_t errnum);
private:
	acl::ofstream out_;
	acl::aio_handle* handle_;
#ifdef WIN32
	HWND hWnd_;
#endif
	http_off_t  read_length_;
	http_off_t  content_length_;
	time_t begin_;
};
