#include "StdAfx.h"
#include "ServerControlInterface2.h"
#include "CommandPacket.h"

CServerControlInterface2::CServerControlInterface2(void)
{
}

CServerControlInterface2::~CServerControlInterface2(void)
{
	CloseServerControl();
}

//////////////////////////////////////////////////////////////////////////////////
//	開始・停止
//////////////////////////////////////////////////////////////////////////////////
/*!
	サーバへ接続
*/
int CServerControlInterface2::OpenServerControl()
{
	Close();
	if(Connect(CONTROL_PIPE_NAME))
		return(-1);
	return(0);
}

/*!
	接続解除
*/
void CServerControlInterface2::CloseServerControl()
{
	Close();
}

//////////////////////////////////////////////////////////////////////////////////
//	制御
//////////////////////////////////////////////////////////////////////////////////
/*!
	サーバ起動
*/
int CServerControlInterface2::StartServer()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("StartServer"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(-1);

	//	エラー？
	if(!responce.IsSuccess())
		return(-1);
	return(0);
}

/*!
	サーバ停止
*/
int CServerControlInterface2::StopServer()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("StopServer"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(-1);

	//	エラー？
	if(!responce.IsSuccess())
		return(-1);
	return(0);
}

/*!
	実行中か取得
*/
int CServerControlInterface2::IsRunning()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("IsRunning"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(0);

	//	エラー？
	if(!responce.IsSuccess())
		return(0);

	return(responce.GetCommandOptionInt(_T("IsRunning")));
}

/*!
	サービス実行か取得
*/
int CServerControlInterface2::IsService()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("IsService"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(0);

	//	エラー？
	if(!responce.IsSuccess())
		return(0);

	return(responce.GetCommandOptionInt(_T("IsService")));
}

/*!
	接続数取得
*/
int CServerControlInterface2::GetConnectionCount()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("GetConnectionCount"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(0);

	//	エラー？
	if(!responce.IsSuccess())
		return(0);

	return(responce.GetCommandOptionInt(_T("ConnectionCount")));
}

/*!
	エラー情報取得
*/
CString CServerControlInterface2::GetServerErrorString()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("GetServerErrorString"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(_T("サーバとの通信に失敗しました。"));

	//	エラー？
	if(!responce.IsSuccess())
		return(_T("サーバとの通信に失敗しました。"));

	return(responce.GetCommandOption(_T("ServerErrorString")));
}

/*!
	サーバルート取得
*/
CString CServerControlInterface2::GetServerRoot()
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("GetServerRoot"));

	//	送信
	if(SendCommandPacket(request, responce))
		return("");

	//	エラー？
	if(!responce.IsSuccess())
		return("");

	return(responce.GetCommandOption(_T("ServerRoot")));
}

/*!
	サーバ情報取得
*/
int CServerControlInterface2::GetServerInfo(CWorkspaceAccess info)
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("GetServerInfo"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(-1);

	//	エラー？
	if(!responce.IsSuccess())
		return(-1);

	//	取得
	info.Copy(responce.GetAttachedDataAccess());
	return(0);
}

/*!
	サーバ設定取得
*/
int CServerControlInterface2::GetServerSetting(CWorkspaceAccess setting)
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("GetServerSetting"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(-1);

	//	エラー？
	if(!responce.IsSuccess())
		return(-1);

	//	取得
	setting.Copy(responce.GetAttachedDataAccess());
	return(0);
}

/*!
	サーバコンテキスト取得
*/
int CServerControlInterface2::GetServerContext(CWorkspaceAccess context)
{
	//	要求パケット
	CCommandPacket	request, responce;
	request.SetCommand(_T("GetServerContext"));

	//	送信
	if(SendCommandPacket(request, responce))
		return(-1);

	//	エラー？
	if(!responce.IsSuccess())
		return(-1);

	//	取得
	context.Copy(responce.GetAttachedDataAccess());
	return(0);
}

//////////////////////////////////////////////////////////////////////////////////
//	オーバーロード
//////////////////////////////////////////////////////////////////////////////////
/*!
	接続メッセージ受信
*/
int CServerControlInterface2::OnWelcome(CBuffer &recv)
{
	//	メッセージを確認
	CCommandPacket	packet;
	if(packet.FromBuffer(recv))
		return(-1);

	//	サーバ名確認
	if(	packet.GetCommand() != _T("Welcome") ||
		packet.GetCommandOption(_T("SupportedInterface")).Find(_T(REQUEST_CONTROL_INTERFACE)) == -1)
		return(-1);

	return(0);
}

//////////////////////////////////////////////////////////////////////////////////
//	ツール
//////////////////////////////////////////////////////////////////////////////////
/*!
	コマンドを送る
*/
int CServerControlInterface2::SendCommandPacket(CCommandPacket &sendCommand, CCommandPacket &recvCommand)
{
	CBuffer	send, recv;
	sendCommand.ToBuffer(send);

	//	送信
	if(SendCommand(send, recv))
	{
		//	再度開いてみる
		if(OpenServerControl())
			return(-1);

		//	コマンド再送信
		if(SendCommand(send, recv))
			return(-1);
	}

	//	受信パケット解釈
	if(recvCommand.FromBuffer(recv))
		return(-1);
	return(0);
}


