#include "StdAfx.h"
#include "servercontrolinterface.h"
#include "ServerController.h"

CServerControlInterface::CServerControlInterface(void)
{
	m_serverLoaded = 0;
}

CServerControlInterface::~CServerControlInterface(void)
{
	//	CoUninitializeより後なので、このコードは落ちる
/*
	if(m_serverLoaded)
		m_serverControl.Release();
	m_serverLoaded = 0;
*/
}

//	サーバーコントロールインターフェースロード
int CServerControlInterface::LoadServerControl()
{
	try
	{
		//	サーバコントローラのインスタンス生成
		HRESULT hr = m_serverControl.CreateInstance(__uuidof(ServerControl));
		if(FAILED(hr))
		{
			//	サーバーを登録して、リトライ
			RegisterServer();
			
			hr = m_serverControl.CreateInstance(__uuidof(ServerControl));
			if(FAILED(hr))
				return(-1);
		}

		m_serverLoaded = 1;
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return(-1);
	}

	return(0);
}

//	リリース
void CServerControlInterface::ReleaseControl()
{
	if(m_serverLoaded)
		m_serverControl.Release();
	m_serverLoaded = 0;
}

//	サーバーの実行開始
int CServerControlInterface::StartServer()
{
	try
	{
		if(m_serverLoaded)
			return(m_serverControl->StartServer());
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return(-1);
	}

	return(-1);
}

//	サーバの停止
void CServerControlInterface::StopServer()
{
	try
	{
		if(m_serverLoaded)
			m_serverControl->StopServer();
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
	}
}

//	サーバのエラー情報を取得
CString CServerControlInterface::GetServerErrorString()
{
	try
	{
		if(m_serverLoaded)
		{
			_bstr_t ret = m_serverControl->GetServerErrorString();
			return((char *)ret);
		}
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return("サーバーとの通信に失敗しました、アプリケーションを再起動してください。");
	}

	return("サーバーとの通信に失敗しました、アプリケーションを再起動してください。");
}

//	実行中か取得する
int CServerControlInterface::IsRunning()
{
	try
	{
		if(m_serverLoaded)
			return(m_serverControl->IsRunning());
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return(0);
	}

	return(0);
}

//	サービスか取得する
int CServerControlInterface::IsService()
{
	try
	{
		if(m_serverLoaded)
			return(m_serverControl->IsService());
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return(0);
	}

	return(0);
}

//	アクセス中か取得する
int CServerControlInterface::IsActive()
{
	try
	{
		if(m_serverLoaded)
			return(m_serverControl->IsActive());
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return(0);
	}

	return(0);
}

//	Infoの取得
CString CServerControlInterface::GetServerInfo()
{
	try
	{
		if(m_serverLoaded)
		{
			_bstr_t ret = m_serverControl->GetServerInfo();
			return((char *)ret);
		}
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return("");
	}

	return("");
}

//	Setting取得
CString CServerControlInterface::GetServerSetting()
{
	try
	{
		if(m_serverLoaded)
		{
			_bstr_t ret = m_serverControl->GetServerSetting();
			return((char *)ret);
		}
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return("");
	}

	return("");
}

//	Context取得
CString CServerControlInterface::GetServerContext()
{
	try
	{
		if(m_serverLoaded)
		{
			_bstr_t ret = m_serverControl->GetServerContext();
			return((char *)ret);
		}
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return("");
	}

	return("");
}


//	サーバルートを取得
CString CServerControlInterface::GetServerRoot()
{
	try
	{
		if(m_serverLoaded)
		{
			_bstr_t ret = m_serverControl->GetServerRoot();
			return((char *)ret);
		}
	}
	catch(const _com_error& Err)
	{
		TRACE("ComError : %s\n",Err.ErrorMessage());
		return("");
	}

	return("");
}

//	アプリケーションモードでサーバを登録する
void CServerControlInterface::RegisterServer()
{
	TRACE("サーバーを登録します。\n");

	CString	command = GET_APP()->GetAppPath() + "04WebServer.exe /InstallApp";

	STARTUPINFO StartupInfo;
	PROCESS_INFORMATION ProcessInfo;

	::ZeroMemory(&StartupInfo, sizeof(STARTUPINFO));
	StartupInfo.cb = sizeof(STARTUPINFO);
	::ZeroMemory(&ProcessInfo, sizeof(PROCESS_INFORMATION));

	int err = CreateProcess(	NULL,
								command.GetBuffer(0),
								NULL,
								NULL,
								FALSE,
								0,
								NULL,
								NULL,
								&StartupInfo,
								&ProcessInfo);

	if(err==0)
		return;

	//	終了まで待つ
	WaitForSingleObject(ProcessInfo.hProcess,INFINITE);

	return;
}
