#ifndef _dkutilGetParam__
#define _dkutilGetParam__

#include "dKingyoMacro.h"
#include "dkutilStdio.h"
#include "dkutilCompileOption.h"

#if DKUTIL_COMPILE_OPTION_MSVC
#	pragma comment(lib,"version.lib")
#endif

namespace dkutil{

extern int dkstrcpy_amap2(char *,size_t,const char *);

struct GetVersionInfo{
protected:
	/*!
	<b>説明:</b>
	この関数は、バージョンリソースのコピーへのポインタ返す。<br>
	バージョンリソースのコピーは、使用後に解放しなくてはならない。<br>
	@return void * …… 関数が成功すると バージョンリソースのコピーへのポインタ を
							　　 関数が失敗すると NULL を返す。
	@param *FileName[in]   ファイル名
	@param **dwTrans[out]   バージョンリソースの言語情報
	*/
	void *GetVersionInfo_( LPTSTR FileName, DWORD **dwTrans )
	{
		void  *pVersionInfo=NULL; // バージョンリソースを指すポインタ
		UINT   uDumy = 0;        //
		DWORD  dwDumy = 0;       //
		DWORD  dwSize = 0;       // バージョンリソースのサイズ

		// バージョンリソースのサイズを取得
		dwSize = ::GetFileVersionInfoSize( FileName, &dwDumy );
		if ( dwSize <= 0 ) return NULL; // 失敗

		pVersionInfo = DKUTIL_SAFE_MALLOC( dwSize );
		if ( !pVersionInfo ) return NULL; // 失敗

		// バージョンリソースを取得
		if ( ::GetFileVersionInfo( FileName, 0, dwSize, pVersionInfo ) )
		{
			// バージョンリソースの言語情報を取得
			if ( VerQueryValue( pVersionInfo, //"\\VarFileInfo\\Translation",
				"\\",(void **)dwTrans, &uDumy ) )
			{
				return pVersionInfo;
			}
		}
		DKUTIL_SAFE_FREE( pVersionInfo );
		return NULL; // 失敗
	}//GetVersionInfo

	/*!
	<b>説明:</b>
	バージョンリソースから、バージョン情報のコピーを取得する。<br>
	@return     BOOL …… 関数が成功すると TRUE  を、 関数が失敗すると FALSE を返す。
	@param char  *Buffer[out] 取得するバージョン情報を受け取るバッファ
	@param void  *pVersionInfo[out] 関数GetVersionInfo() の戻り値
	@param DWORD  dwTrans[in] バージョンリソースの言語情報
	@param const char  *KeyWord[in] 取得したいバージョン情報の名前 (詳しくはGetInfo()のwant引数にて
	*/
	BOOL GetVersionValue( char *Buffer,size_t BufferSize, void *pVersionInfo, DWORD dwTrans, const char *KeyWord )
	{
		char *pValue=NULL; // バージョンリソース中のバージョン情報を指すポインタ
		char  Path[MAX_PATH+1]="";
		UINT  uDumy = 0;
		WORD  wCodePageID[] = { 0, 932, 949, 950, 1200, 1250, 1251, 1252, 1253, 1254, 1255, 1256 };
		WORD  wLanguageID[] = { 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x040D, 0x040E, 0x040F, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, 0x0420, 0x0421, 0x0804, 0x0807, 0x0809, 0x080A, 0x080C, 0x0810, 0x0813, 0x0814, 0x0816, 0x081A, 0x0C0C, 0x100C };

		sprintf( Path, "\\StringFileInfo\\%04x%04x\\%s", LOWORD(dwTrans), HIWORD(dwTrans), KeyWord );
		if ( VerQueryValue( pVersionInfo, Path, (void **)&pValue, &uDumy ) )
		{
			//strcpy( Buffer, pValue );
			dkstrcpy_amap2(Buffer,BufferSize,pValue);
			return TRUE; // 成功
		}

		// バージョンリソースに言語情報が記録されていない場合
		for( int i = 0; i < ( numof(wCodePageID) ); i++ )
		{
			for( int j = 0; j < numof(wLanguageID); j++ )
			{
				sprintf( Path, "\\StringFileInfo\\%04x%04x\\%s", wLanguageID[j], wCodePageID[i], KeyWord );
				if ( VerQueryValue( pVersionInfo, Path, (void **)&pValue, &uDumy ) )
				{
					dkstrcpy_amap2(Buffer,BufferSize,pValue);
					return TRUE; // 成功
				}
			}
		}

		Buffer[0] = '\0';
		return FALSE; // 失敗
	}//GetVersionValue

public:
	GetVersionInfo(){}
	/*!
	@param filename[in] バージョンを調べたいファイルへのパス
	@param buff[in] 調べたい情報の文字列を格納するバッファ
	@param bufsize[in] バッファのサイズ
	@param want[in] 調べたい情報の指定　下記参照<br>
	<PRE>
	      "Comments"         // コメント
	      "CompanyName"      // 会社名
	      "FileDescription"  // 説明
	      "FileVersion"      // ファイルバージョン
		    "InternalName"     // 内部名
	      "LegalCopyright"   // 著作権
	      "LegalTrademarks"  // 商標
	      "OriginalFilename" // 正式ファイル名
	      "PrivateBuild"     // プライベートビルド情報
	      "ProductName"      // 製品名
	      "ProductVersion"   // 製品バージョン
	      "SpecialBuild"     // スペシャルビルド情報
	</PRE>
	@return trueで上手く取得できた。
	*/
	bool GetInfo(const char *filename,char *buff,size_t bufsize,const char *want)
	{
		// argv[0]（自分自身）のバージョン情報
		void *pVersionInfo=NULL;
		DWORD *dwTrans=NULL;
		char filenamebuff[1024]="";
		dkstrcpy_amap2(filenamebuff,sizeof(filenamebuff),filename);
		
		pVersionInfo = GetVersionInfo_(filenamebuff, &dwTrans );
		if (! pVersionInfo ) return false;
		
		GetVersionValue( buff,bufsize, pVersionInfo, *dwTrans, want ); 
		DKUTIL_SAFE_FREE( pVersionInfo );
		return true;
		
	}
	bool GetFileInfo(LPCTSTR filename,VS_FIXEDFILEINFO *vffi){
		ULONG tem;
		char filenamebuff[1024]="";
		dkstrcpy_amap2(filenamebuff,sizeof(filenamebuff),filename);
		UINT size = GetFileVersionInfoSize(filenamebuff,&tem);
		//size += 5;
		void *vbuf = DKUTIL_SAFE_MALLOC(size);
		bool r = false;
		if (GetFileVersionInfo(filenamebuff, 0, size, vbuf))
		{
				void *buf = NULL;
				VerQueryValue(vbuf,TEXT("\\"),&buf,&size);         // バージョンを取得
				CopyMemory( vffi, buf, sizeof(VS_FIXEDFILEINFO)); //コピー
				r = true;
		}

		// ★ vffi 構造体にいろいろ入っているのでそれを必要に応じてコピー
		// ★ コメントなど取得するときもこの中で取得する

		DKUTIL_SAFE_FREE(vbuf); // メモリ解放
		return r;
	}

};//end of struct class


///d金魚がコンパイルしたこのライブラリに使ったSTLPortのバージョンを返します。
///@return 成功＝_STLPORT_VERSION　/　STLPortを使っていないらしい＝edk_FAILED
extern int GetCompiledDKUTIL_STLPortVersion();

///d金魚がコンパイルしたこのライブラリに使ったBoostのバージョンを返します。
///@return BOOST_VERSION
extern int GetCompiledDKUTIL_BoostVersion();

///d金魚がコンパイルしたこのライブラリに使ったzlibのバージョンを返します。
///@return ZLIB_VERSION : "ERROR:関数名"== zlibは使っていない
extern const char *GetCompiledDKUTIL_zlibVersionString();

///d金魚がコンパイルしたこのライブラリに使ったlibpngのバージョンを返します。
///@return PNG_LIBPNG_VER_STRING : "ERROR:関数名"== libpngは使っていない
extern const char *GetCompiledDKUTIL_libpngVersionString();
///GetCompiledDKUTIL_libpngVersionString()の数字版です。
///@return PNG_LIBPNG_VER : edk_FAILED==libpngは使っていない。
extern int GetCompiledDKUTIL_libpngVersion();
/*!
@param flag[in] trueだと、dKingyoUtilClassの著作権情報と謝辞をコピー＋返してくれる。
@param copy[out] コピーするバッファ
@param size[in] コピーするバッファのサイズ
*/
///@return このライブラリのCopyrightの文字列
extern const char *GetdKingyoUtilClassOriginalCopyright(bool flag=true,char *copy=NULL,size_t size=NULL);



}//end of dkutil namespace
	

#endif
