#pragma once

#include "ActionInvoker.hpp"


class BeepActionInvoker
	: public ActionInvoker
{
private:
	BeepActionInvoker(const BeepActionInvoker&); //<! 実装なし
	BeepActionInvoker& operator=(const BeepActionInvoker&); //<! 実装なし

public:
	/*!
	 * 監視設定を指定してアクションを構築します。
	 * \param 監視設定
	 */
	BeepActionInvoker(const CSettingInfo& v_settingInfo) throw();
	
	/*!
	 * デストラクタ
	 */
	virtual ~BeepActionInvoker() throw();

	/*!
	 * 永続化状態をリセットします。
	 */
	virtual void Reset();

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

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

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

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

protected:

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

	/*!
	 * プロセスの実行。
	 * appNameが省略された場合はMessageBeepの情報音を使う。
	 * あるいはwavファイルまたはシステム定義のエイリアスを指定する。
	 * \param v_absoluePath ターゲットの絶対パス
	 * \param v_fileInfo ターゲットのファイル情報
	 * \param verb アクションタイプ
	 * \param appName アプリケーション名(展開済み)
	 * \param param パラメータ(展開済み)
	 * \param appCurrentDir カレントディレクトリ(展開済み)
	 */
	virtual bool internalDoAction(
		const tstring v_absolutePath,
		const CFileInfo& v_fileInfo,
		const tstring& verb,
		const tstring& appName, 
		const tstring& param,
		const tstring& appCurrentDir) throw();
};

/*
プログラムイベント 	エイリアス
Windowsの起動 	SystemStart
Windowsの終了 	SystemExit
Windowsログオフ 	WindowsLogoff
Windowsログオン 	WindowsLogon
システムエラー 	SystemHand
システム通知 	SystemNotification
ツールバーバインドの表示 	ShowBand
デバイスの切断 	DeviceDisconnect
デバイスの接続 	DeviceConnect
デバイスの接続の失敗 	DeviceFail
バッテリー切れアラーム 	CriticalBatteryAlarm
バッテリー低下アラーム 	LowBatteryAlarm
プログラムエラー 	AppGPFault
プログラムの起動 	Open
プログラムの終了 	Close
メッセージ（警告） 	SystemExclamation
メッセージ（情報） 	SystemAsterisk
メッセージ（問い合わせ） 	SystemQuestion
メニューコマンド 	MenuCommand
メニューポップアップ 	MenuPopup
一般の警告音 	.Default
印刷完了 	PrintComplete
元に戻す（拡大） 	RestoreUp
元に戻す（縮小） 	RestoreDown
最小化 	Minimize
最大化 	Maximize
新着メールの通知 	MailBeep
選択 	CCSelect
*/
