#include "stdafx.h"
#include "resource.h"
#include "FWatchApp.hpp"

#include "BeepActionInvoker.hpp"

#include <Mmsystem.h>
#pragma comment(lib, "Winmm.lib")


// BeepActionInvokerの識別子
// {FDE7F7A4-7432-4cf2-AC54-E6F752D0E22F}
static const GUID BEEP_ACTIONINVOKE_SIG =
	{ 0xfde7f7a4, 0x7432, 0x4cf2, { 0xac, 0x54, 0xe6, 0xf7, 0x52, 0xd0, 0xe2, 0x2f } };


/*!
 * 監視設定を指定してアクションを構築します。
 * \param 監視設定
 */
BeepActionInvoker::BeepActionInvoker(const CSettingInfo& v_settingInfo) throw()
	: ActionInvoker(v_settingInfo)
{
}

/*!
 * デストラクタ
 */
BeepActionInvoker::~BeepActionInvoker() throw()
{
}

/*!
 * 永続化状態をリセットします。
 */
void BeepActionInvoker::Reset()
{
}

/*!
 * 永続化状態を読み込みます。
 * \param reader オブジェクトリーダ
 */
void BeepActionInvoker::Load(CObjectReader &reader)
{
	reader.VerifySig(BEEP_ACTIONINVOKE_SIG);
}

/*!
 * 永続化状態を保存します。
 * \param writer オブジェクトライタ
 */
void BeepActionInvoker::Save(CObjectWriter &writer)
{
	writer.WriteSig(BEEP_ACTIONINVOKE_SIG);
}

/*!
 * アクションが実行可能かチェックします。
 * \return 最大数が指定されていないか、最大数を超えていなければtrue
 */
bool BeepActionInvoker::canDoAction() throw()
{
	return true;
}

/*!
 * ガベージコレクトします。
 *終了済みのプロセス等をチェックするために定期的に呼び出す必要があります。
 */
unsigned int BeepActionInvoker::sweepGarbage() throw()
{
	return 0;
}


/*!
 * 特殊変数COUNTの展開に使用する総実行回数を取得ます。
 * \return 総実行回数
 */
DWORD BeepActionInvoker::internalGetRunCount()
{
	return 0;
}

/*!
 * プロセスの実行
 * \param v_absoluePath ターゲットの絶対パス
 * \param v_fileInfo ターゲットのファイル情報
 * \param verb アクションタイプ
 * \param appName アプリケーション名(展開済み)
 * \param param パラメータ(展開済み)
 * \param appCurrentDir カレントディレクトリ(展開済み)
 * \return 継続フラグ(常にfalseを返します。)
 */
bool BeepActionInvoker::internalDoAction(
	const tstring , //v_absolutePath
	const CFileInfo& , //v_fileInfo
	const tstring& , //verb
	const tstring& appName,
	const tstring& , //param
	const tstring& ) throw() //appCurrentDir
{
	if (appName.empty()) {
		// ログ
		if (pLogger_) {
			pLogger_->LogMessage(2, NULL, 0, IDS_LOGMES_BEEP, _T("*default"));
		}
		// Informationサウンド
		::MessageBeep(MB_ICONASTERISK);
	}
	else {
		// ログ
		if (pLogger_) {
			pLogger_->LogMessage(2, NULL, 0, IDS_LOGMES_BEEP, appName.c_str());
		}
		// システムイベント名またはwavファイル名を指定して再生(非同期)
		if ( !PlaySound(appName.c_str(), 0, SND_ASYNC)) {
			// 再生に失敗した場合
			DWORD err = GetLastError();
			if (pLogger_) {
				pLogger_->LogMessage(0, NULL, err, IDS_LOGMES_BEEP_FAILED);
			}
		}
	}
	return false;
}
