////////////////////////////////////////////////////////////////////////////
// CSyInstance クラスのインタフェース宣言
// 主筆のインスタンスを管理する
////////////////////////////////////////////////////////////////////////////

#if !defined( SYINSTANCE_H_INCLUDED_ )
#define SYINSTANCE_H_INCLUDED_

#include <string>
#include <list>
#include "Semaphore.h"
#include "NegCmd.h"

using namespace std;

// 起動している主筆の情報
typedef struct tagTAEDIT_INFO
{
	tagTAEDIT_INFO( const string& argFName, int argPID ) :
		FileName( argFName ),
		pid( argPID )
	{};
	tagTAEDIT_INFO(){}
		
	string FileName;	// ファイル名
	int pid;			// pid
} TAEDIT_INFO;

class CSyInstance
{
public:
	CSyInstance();
	~CSyInstance();

	// 初期化
	bool Initialize();

	// 既存の主筆の情報を取得
	void UpdateExistTaEditInfo();

	// ファイルのオープン（主筆の起動・アクティブ化）
	void OpenFile_CS( const CNegCmd &rCmd, CNegCmd *pToClient );

	// 主筆側でファイルが開かれる
	void OpenFile_TS( const CNegCmd &rCmd, CNegCmd *pToClient );

	// 主筆側でファイルに名前を付けて保存が行われる
	void NewFile_TS( const CNegCmd &rCmd, CNegCmd *pToClient );

	// 主筆側でファイルに名前を付けて保存が行われる
	void WriteFile_TS( const CNegCmd &rCmd, CNegCmd *pToClient );

	// 主筆側が終了する
	void Exit_TS( const CNegCmd &rCmd, CNegCmd *pToClient );

	// サーバを停止させることが可能か否か
	bool CanBeStopServer() const;

	// サーバを強制停止させる
	void StopServerByForce_CS();

	// 新しい主筆でファイルを開く
	void OpenFileNW_TS( const CNegCmd &rCmd, CNegCmd *pToClient );

	// 主筆がコンストラクション・モードに参加する
	void Join_TS( const CNegCmd &rCmd, CNegCmd *pToClient );

protected:

	// 既存の主筆の情報を取得
	bool SearchExistTaEditInfo( list< TAEDIT_INFO > *pList );

	// 主筆を起動
	int StartSyuhitu( const string &FileName, const CNegCmd &rCmd ) const;

	// 指定された主筆をアクティブにする
	bool ActivateSyuhitu( int pid, const CNegCmd &rCmd ) const;

	// 与えられた名前のパイプを指定されたディスクリプタと置き換える
	int BindFD( int fd, const string &FName, bool IsRead ) const;

	// 主筆に開いているファイル名を問い合わせる
	bool RequestFileName_ToTaEdit( int pid, string *pFName );

	// 主筆にサーバが再起動したことを通知する
	bool NoticeServerReboot_ToTaEdit( int pid );

	// 主筆にコマンドを送信する
	bool SendCmdToTaEdit( const CNegCmd& r, int pid, CNegCmd *pRet ) const;

	// 主筆のインスタンス（ファイル名とpid）
	list< TAEDIT_INFO > listInstance;

	// 名前付きパイプが格納されるパス
	string CommunityPath;

	// エラーメッセージを保持する
	const char *pErrorMsg;
};

#endif // SYINSTANCE_H_INCLUDED_

