#include "StdAfx.h"
#include "fileputresponse.h"
#include "connection.h"
#include "dir.h"

CFilePutResponse::CFilePutResponse(CServer *server,CConfigAccess context,CRequest request,CAlias alias)
: CNormalResponse(server,context,request,alias)
{
	m_writeFile = 0;
}

CFilePutResponse::~CFilePutResponse(void)
{
	try
	{
		m_file.Close();
	}
	catch(CFileException *err)
	{
		err->Delete();
	}
}

/*
	準備
*/
void CFilePutResponse::PreCreateResponse()
{
	//	レスポンスコード
	SetResponseCode(201);	//	OK

	if(m_request.m_method == "MKCOL")
	{
		CDir::MakeAllDirectory(m_alias.GetTarget());
	}
	else if(m_request.m_method == "PUT")
	{
		try
		{
			if(!m_file.Open(m_alias.GetTarget(),	CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive))
				throw CServerFatalException("ファイルのオープンに失敗しました、サーバー上のファイルは、使用中のためロックされている可能性があります");

			m_writeFile = 1;
		}
		catch(CFileException *err)
		{
			TRACE("File error : %s\n",err->m_strFileName);
			err->Delete();
			throw CServerFatalException("ファイルの操作に失敗しました、システムエラーです");
		}
	}
}

/*
	データ受信
*/
void CFilePutResponse::SetNextData(CBuffer &data)
{
	if(m_writeFile)
	{
		try
		{
			m_file.Write(data.GetPtr(),data.GetSize());
		}
		catch(CFileException *err)
		{
			TRACE("File error : %s\n",err->m_strFileName);
			err->Delete();
			throw CServerFatalException("ファイルの操作に失敗しました、システムエラーです");
		}
	}
}

/*
	レスポンス生成
*/
void CFilePutResponse::CreateResponse()
{
}


/*!
	レスポンスサイズの取得
*/
__int64 CFilePutResponse::GetResponseSize()
{
	return(0);
}

/*!
	レスポンスの取得
*/
int CFilePutResponse::GetNextData(CBuffer &data)
{
	data.ReSize(0);
	return(0);
}

