#pragma once

#include "ActionInvoker.hpp"


class UDPSendActionInvoker
	: public ActionInvoker
{
private:
	WSAData wsaData_;
	int initResult_;
	DWORD msgid_;

	UDPSendActionInvoker(const UDPSendActionInvoker&); //<! 実装なし
	UDPSendActionInvoker& operator=(const UDPSendActionInvoker&); //<! 実装なし

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

	/*!
	 * プロセス実行パラメータの調整。
	 * アクションに応じて特殊変数・環境変数の展開し、非印字文字列を補正するなどを行う。
	 * \param expander 置換変数の展開
	 * \param v_absolutePath 絶対パス
	 * \param fileInfo ファイル情報
	 * \param verb アクションタイプを保存する
	 * \param appName アプリケーションを保存する
	 * \param param パラメータを保存する。
	 * \param appCurrentDir カレントディレクトリを保存する。
	 */
	virtual void adjustParameters(
		PropertyStringExpander expander,
		const tstring &v_absoluePath,
		const CFileInfo &fileInfo,
		tstring& verb,
		tstring& appName, 
		tstring& param,
		tstring& appCurrentDir) throw();

	/*!
	 * プロセスの実行
	 * \param v_absoluePath ターゲットの絶対パス
	 * \param v_fileInfo ターゲットのファイル情報
	 * \param verb アクションタイプ
	 * \param appName アプリケーション名(展開済み)
	 * \param param パラメータ(展開済み)
	 * \param appCurrentDir カレントディレクトリ(展開済み)
	 * \return 継続フラグ、trueであれば非同期に実行されたことを示す
	 */
	virtual bool internalDoAction(
		const tstring v_absolutePath,
		const CFileInfo& v_fileInfo,
		const tstring& verb,
		const tstring& appName, 
		const tstring& param,
		const tstring& appCurrentDir) throw();

	/*!
	 * メッセージをLF改行のバイト文字列に変換します。
	 * \param msg メッセージ
	 * \return LF改行のバイト文字列
	 */
	std::string convertByteStrWithoutCR(const tstring &msg);
};
