#include "StdAfx.h"
#include "systemresponse.h"
#include "resource.h"		// メイン シンボル
#include "connection.h"
#import <msxml3.dll>

CSystemResponse::CSystemResponse(CServer *server,CWorkspaceAccess context,CString info,int code,CString detail)
: CResponse(server,context)
{
	m_info = info;
	m_detail = detail;
	m_code = code;
	m_done = 0;
}

CSystemResponse::~CSystemResponse(void)
{
}

//	詳細の取得
CString CSystemResponse::GetDetail()
{
	return(m_detail);
}

//	情報の取得
CString CSystemResponse::GetInfo()
{
	return(m_info);
}

/*
	レスポンス生成
*/
void CSystemResponse::CreateResponse()
{
	//	レスポンスコード
	SetResponseCode(m_code);

	//	HTMLファイルのディレクトリ取得
	CString path = m_setting.GetConfig("Html\\HtmlFileDirectory","%ServerRoot%Html\\");

	//	まずは、コード別
	CString name;
	name.Format("Response_%03d.html",m_code);
	int ret = m_body.LoadFromFile(path + name);

	//	無いなら、デフォルト
	if(ret != 0)
		ret = m_body.LoadFromFile(path + "Response_default.html");

	//	ファイルが無いなら、リソースから
	if(ret != 0)
		ret = m_body.LoadFromResource(IDR_RESPONSE);
	
	//	ロードできない場合は、死亡・・・
	if(ret != 0)
		throw CServerFatalException("HTMLデータのロードに失敗しました、リソースが破壊されているか、システムエラーです");

	//	置き換え処理
	m_body.SwapKey("Info",m_info);
	m_body.SwapKey("Detail",m_detail);

	m_body.SwapKey(m_context);
	m_body.SwapKey(m_serverInfo);
	m_body.SwapKey(m_requestInfo);
	m_body.SwapKey(m_responseInfo);
}


/*!
	レスポンスサイズの取得
*/
__int64 CSystemResponse::GetResponseSize()
{
	if(m_responseInfo.GetConfig("ResponseCode",200) == 304)
		return(0);	//	304	はボディなし
	else
		return(m_body.m_html.GetLength());
}

/*!
	レスポンスの取得
*/
int CSystemResponse::GetNextData(CBuffer &data)
{
	//	304
	if(m_responseInfo.GetConfig("ResponseCode",200) == 304)
		return(0);

	if(m_done)
	{
		return(0);
	}
	else
	{
		if(m_body.m_html.GetLength()==0)
			throw CServerFatalException("HTMLデータのロードに失敗しました、システムエラーです");

		m_done = 1;
		data = m_body.m_html;
		return(data.GetSize());
	}
}
