#include"CProcessMutex.h"
#include"../CString.h"
#include"../Debug/CException.h"

namespace Maid
{

/*!
 	@class CProcessMutex CProcessMutex.h
 	@brief プロセスレベルの同期オブジェクト
 */


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! コンストラクタ
/*!
 */
CProcessMutex::CProcessMutex()
{
	m_hMutex = NULL;
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! デストラクタ
/*!
 */
CProcessMutex::~CProcessMutex()
{
	Close();
}


/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! ミューテクスを作成する
/*!
 	@param  MutexName	[i ]	作成するミューテクス名
 	@param  IsOriginal	[i ]	唯一のミューテックスにするか？(デフォルトでTRUE）
 
	@exception CException 作成できなかった場合
 */
void CProcessMutex::Open( const mstring& MutexName, bool IsOriginal )
{
	Close();

	const MySTL::string sjis_name = CString::ConvertMAIDtoSJIS(MutexName);

	m_hMutex = ::CreateMutex( NULL, TRUE, sjis_name.c_str() );
	if( m_hMutex==NULL ) 
	{
		MAID_THROWEXCEPTION(MutexName + MAIDTEXT("ミューテックスの作成に失敗") );
	}

	if( IsOriginal && (::GetLastError()==ERROR_ALREADY_EXISTS) ) 
	{
		::CloseHandle(m_hMutex); 
		MAID_THROWEXCEPTION(MutexName + MAIDTEXT("ミューテックスはすでに存在しています") );
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! ミューテクスを閉じる
/*!
 */
void CProcessMutex::Close()
{
	if( m_hMutex!=NULL )
	{
		::CloseHandle(m_hMutex);
		m_hMutex = NULL;
	}
}

/*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
//! 指定したミューテックスがすでに存在しているか調べる
/*!
 *	\param  MutexName		[i ]	調べるミューテクス名
 *
 *	\return	存在していたら true
\n			存在していなかったら false
 */
bool CProcessMutex::IsExist(  const mstring& MutexName )
{
	const MySTL::string sjis_name = CString::ConvertMAIDtoSJIS(MutexName);

	HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, sjis_name.c_str());

	if( hMutex != NULL ) { ::CloseHandle(hMutex); return true; }

	return false;
}


}
