/*!
 *  \file Registry04.h
 *  \brief レジストリ操作クラス CRegistry04 のインターフェイス
 *  \author kishy
 *
 *  \since 2002/6/8
 */

#if !defined(AFX_REGISTRY04_H__B4E1D123_4278_4F87_BEC2_8EBF82D9C05B__INCLUDED_)
#define AFX_REGISTRY04_H__B4E1D123_4278_4F87_BEC2_8EBF82D9C05B__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

/////////////////////////////////////////////////////////////////////////////
// CRegistry04

//! レジストリ操作クラス
class CRegistry04
{
#	if defined(REG_QWORD)
	//! \name クラス内型
	public:
	//@{
		typedef unsigned __int64 QWORD;
	//@}
#	endif

	//! \name 構築・消滅
	public:
	//@{
		CRegistry04();
		virtual ~CRegistry04() throw();
	//@}

	//! レジストリ操作用データ
	protected:
	//@{
		BOOL m_fAttached;			//!< ハンドルのアタッチによる生成か

		HKEY m_hKey;				//!< レジストリキーハンドル
		HKEY m_hParentKey;			//!< 親レジストリキーハンドル
		REGSAM m_mode;				//!< キーのアクセスモード
		DWORD m_disposition;		//!< 新規か既存キーか

		CString m_pathName;			//!< パス名格納用

		DWORD m_nSubKeys;			//!< 下位に含まれるサブキーの数
		DWORD m_nMaxSubKeyNameLen;	//!< 下位に含まれるサブキー名の最大長
		int m_nEnumIndex;			//!< 列挙時のインデックス

		DWORD m_nValues;			//!< 下位に含まれる値の数
		DWORD m_nMaxValueNameLen;	//!< 下位に含まれる値名の最大長
		DWORD m_nMaxValueDataLen;	//!< 下位に含まれる値の最大長

		CString m_subKeyName;		//!< サブキー名格納用
	//@}

	//! \name 動作フラグ
	public:
	//@{
		BOOL m_bMessage;			//!< エラーメッセージ表示フラグ
	//@}

	//! \name 開閉処理
	public:
	//@{
		BOOL Open(HKEY hKey, const CString &subKeyName, const CString &mode = _T("a"));
		BOOL Open(const CRegistry04 &reg, const CString &subKeyName, const CString &mode = _T("a"));
		void Close() throw();
	//@}

	//! \name 更新処理
	public:
	//@{
		BOOL Refresh();
	//@}

	//! \name アタッチ・デタッチ処理
	public:
	//@{
		BOOL Attach(HKEY hKey, const CString &keyName = _T(""), HKEY hParentKey = 0);
		HKEY Detach() throw();
	//@}

	//! \name サブキー列挙処理
	public:
	//@{
		DWORD EnumSubKey(BOOL fInitialize = FALSE);
	//@}

	//! \name 削除処理
	public:
	//@{
		BOOL DeleteValue(const CString &valueName);
		BOOL DeleteSubKey(const CString &subKeyName);
	//@}

	//! \name キー値取得処理
	public:
	//@{
		BOOL QueryValue(LPBYTE &pValue, DWORD &nValueLen, const CString &valueName);
		BOOL QueryValue(DWORD &value, const CString &valueName);
		BOOL QueryValue(CString &value, const CString &valueName);
		BOOL QueryValue(CStringArray &value, const CString &valueName);
	//@}

	//! \name キー値設定処理
	public:
	//@{
		BOOL SetValue(const CString &valueName, LPBYTE pValue, DWORD nValueLen);
		BOOL SetValue(const CString &valueName, DWORD value);
		BOOL SetValue(const CString &valueName, const CString &value);
		BOOL SetValue(const CString &valueName, const CStringArray &value);
	//@}

	//! \name サブキー値取得処理
	public:
	//@{
		BOOL QuerySubKeyValue(const CString &subKeyName, LPBYTE &pValue, DWORD &nValueLen, const CString &valueName);
		BOOL QuerySubKeyValue(const CString &subKeyName, DWORD &value, const CString &valueName);
		BOOL QuerySubKeyValue(const CString &subKeyName, CString &value, const CString &valueName);
		BOOL QuerySubKeyValue(const CString &subKeyName, CStringArray &value, const CString &valueName);
	//@}

	//! \name サブキー値設定処理
	public:
	//@{
		BOOL SetSubKeyValue(const CString &subKeyName, const CString &valueName, LPBYTE pValue, DWORD nValueLen);
		BOOL SetSubKeyValue(const CString &subKeyName, const CString &valueName, DWORD value);
		BOOL SetSubKeyValue(const CString &subKeyName, const CString &valueName, const CString &value);
		BOOL SetSubKeyValue(const CString &subKeyName, const CString &valueName, const CStringArray &value);
	//@}

#if defined(REG_QWORD)
	//! \name QWORD系処理
	public:
	//@{
		BOOL QueryValue(QWORD &value, const CString &valueName);
		BOOL SetValue(const CString &valueName, QWORD value);
		BOOL QuerySubKeyValue(const CString &subKeyName, QWORD &value, const CString &valueName);
		BOOL SetSubKeyValue(const CString &subKeyName, const CString &valueName, QWORD value);
	//@}
#endif

	//! \name 動作設定処理
	public:
	//@{
		void EnableMessage(BOOL bMessage = TRUE) { m_bMessage = bMessage; }
	//@}

	//! \name プロパティ取得
	public:
	//@{
		HKEY GetHandle() const { return m_hKey; }
		BOOL IsCreatedKey() const { return m_disposition == REG_CREATED_NEW_KEY; }
		BOOL IsExistingKey() const { return m_disposition == REG_OPENED_EXISTING_KEY; }

		CString GetSubKeyName() const { return m_subKeyName; }
		CString GetPathName() const { return m_pathName; }

		DWORD GetSubKeys() const { return m_nSubKeys; }
		DWORD GetMaxSubKeyNameLen() const { return m_nMaxSubKeyNameLen; }
		DWORD GetMaxValueNameLen() const { return m_nMaxValueNameLen; }
		DWORD GetMaxValueDataLen() const { return m_nMaxValueDataLen; }
	//@}

	//! \name インプリメンテーション
	protected:
	//@{
		void Clean() throw();
		BOOL QueryInfoKey();
		CString HKEY2String(HKEY hKey);

		void MessageBox(const CString &msg);
	//@}
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ は前行の直前に追加の宣言を挿入します。

#endif // !defined(AFX_REGISTRY04_H__B4E1D123_4278_4F87_BEC2_8EBF82D9C05B__INCLUDED_)
