#include "StdAfx.h"
#include "filemoveresponse.h"
#include "connection.h"
#include "UrlUtility.h"
#include "Dir.h"

CFileMoveResponse::CFileMoveResponse(CServer *server,CWorkspaceAccess context,CRequest request,CAlias alias)
: CNormalResponse(server,context,request,alias)
{
	//	消す前にすでに無いとか
	if(alias.IsExist()==0)
		throw new CSystemResponse(server,context,"指定されたファイルは存在しません",404);
}

CFileMoveResponse::~CFileMoveResponse(void)
{
}

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

	//	出力先の取得
	CString	destUrl = m_request.GetOptionAccess().GetConfig("Destination","",TRUE);

	//	指定先が無い
	if(destUrl.GetLength() <= 7)
		throw new CSystemResponse(m_server,m_context,"出力先が異常です",500);

	//	加工()
	int	index = destUrl.Find("://");
	if(index!=-1)
		destUrl = destUrl.Mid(index + 3);

	index = destUrl.Find("/");
	if(index!=-1)
		destUrl = destUrl.Mid(index);

	destUrl = CUrlUtility::DecodeUrl(destUrl);
	
	CAlias	destAlias(destUrl,m_alias.GetTargetHost(),m_setting);

	//	同じ設定？
	if(destAlias.GetPathInfo().GetConfig("LocalPath","") != m_alias.GetPathInfo().GetConfig("LocalPath",""))
		throw CServerFatalException("移動不可能な組み合わせです");

	if(m_request.GetMethod() == "MOVE")
	{
		if(::MoveFile(m_alias.GetTarget(),destAlias.GetTarget())==0)
			throw CServerFatalException("ファイルの操作に失敗しました、システムエラーです");
	}
	else if(m_request.GetMethod() == "COPY")
	{
		if(m_alias.IsDirectory())
		{
			CDir::MakeAllDirectory(destAlias.GetTarget());

			CDir	dir;
			dir.FindFile(m_alias.GetTarget() + "*.*",TRUE);

			CString	destPath = destAlias.GetTarget();
			destPath = CDir::AddBackSlash(destPath);

			int srcLen = m_alias.GetTarget().GetLength();
			for(int i=0;i<dir.GetFileCount();i++)
			{
				CString	path = destPath + dir.GetFilePath(i).Mid(srcLen);
				CDir::MakeAllDirectory(CDir::PathToDir(path));

				if(::CopyFile(dir.GetFilePath(i),path,FALSE)==0)
					throw CServerFatalException("ファイルの操作に失敗しました、システムエラーです");
			}
		}
		else
		{
			if(::CopyFile(m_alias.GetTarget(),destAlias.GetTarget(),FALSE)==0)
				throw CServerFatalException("ファイルの操作に失敗しました、システムエラーです");
		}
	}
}


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

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

