//==============================================================================================================================
//	変換ルーチンベースプログラム
//
//
//==============================================================================================================================


typedef struct
{
	char	id[4];
	int		size;
	INT64	tex0_reg;
	int		format_id;
	int		width;
	int		hight;
	int		plane;
}TEXTURE_HEADER;


#define	BAI		1

//------------------------------------------------------------------
//		スクリプトコマンドクラス
//------------------------------------------------------------------
class FILECHECK
{
	BOOL		m_bInitialized;
	BOOL		m_bImplemented;
	
	short		mono1_stereo2;			//	モノラル or ステレオ
	long		samplingfreq;			//	サンプリングレート
	short		bitlength;				//	サンプリングビット数
	long		bytesinfile;
	short		chbytes_per_sample;
	long		bytes_per_sec;
	
	
	unsigned long	get_ulong(FILE *f);
	unsigned 		get_ushort(FILE *f);
	
	void		GetWavInfo( LPCTSTR filenameld );
	void		etc_file( LPCTSTR filename );
//	void		get_hepinfo( LPCTSTR filename );
	void		get_bmpinfo( LPCTSTR filename );
	
public:
	void		Initialize();
	int			Func( LPCTSTR _sParamString );
	void		Quit( BOOL _bExit );
	
	FILECHECK();
	~FILECHECK();
	
};

FILECHECK::FILECHECK()
	: m_bInitialized( FALSE )
	, m_bImplemented( FALSE )
	, mono1_stereo2( 1 )
	, samplingfreq( 11025 )
	, bitlength( 8 )
	, bytesinfile( 11025 )
	, chbytes_per_sample( 1 )
	, bytes_per_sec( 11025 )
{
}
FILECHECK::~FILECHECK()
{
}
//----	ここより上は変更の必要なし(変数等の追加は自由)


//------------------------------------------------------------------
//		スクリプトコマンドの初期化
//			(特に必要ないなら変更の必要なし)
//------------------------------------------------------------------
void	FILECHECK::Initialize()
{
	if( m_bInitialized == TRUE )	return;
	m_bInitialized = TRUE;	//	初期済みフラグ
	
	//	処理開始前に一回だけ行う初期化はここで
	
	mono1_stereo2 = 1;				//	モノラル or ステレオ
	samplingfreq = 11025;			//	サンプリングレート
	bitlength = 8;					//	サンプリングビット数
	bytesinfile = 11025;
	chbytes_per_sample = 1;
	bytes_per_sec = 11025;
	
}

//------------------------------------------------------------------
//		スクリプトコマンドの終了
//			(特に必要ないなら変更の必要なし)
//------------------------------------------------------------------
void	FILECHECK::Quit( BOOL _bExit )
{
	if( m_bImplemented == FALSE)	return;
	m_bImplemented = FALSE;
	m_bInitialized = FALSE;
	
	//終了処理
	//	終了処理は変換処理が実行された場合のみ行う
	
}



//********************************************************************************************
/**
 * @brief		ｗａｖデータを読み込み情報を取得
 * @author		N.Takeda
 *
 * @param[in]	LPCTSTR	_pFileNameId	wavファイル名.
 *
 * @return		なし (none)
 */
//********************************************************************************************
void	FILECHECK::GetWavInfo( LPCTSTR _pFileNameId )
{
	unsigned long	length;
	unsigned char	ss[10];
	FILE			*ifp;
	int				len;
	
	
	len = FILE_GetFileSize( _pFileNameId );
#ifdef	_UNICODE
	CTOSJIS	toJis;
	if(fopen_s( &ifp, toJis.From(_pFileNameId), "rb" ) == 0)
#else
	if( fopen_s( &ifp, _pFileNameId, TEXT("rb") ) == 0 )
#endif
	{
		fread( ss, 4, 1, ifp );					///< "RIFF" 
		bytesinfile = get_ulong(ifp);			///< total bytes in the file
		fread( ss, 8, 1, ifp );					///< "WAVEfmt" 
		length = get_ulong(ifp);				///< 16 -- always
		length = get_ushort(ifp);				///< 1: pcm
		mono1_stereo2 = get_ushort(ifp);		///< 1: mono, 2; stereo
		samplingfreq = get_ulong(ifp);			///< sampling frequency
		bytes_per_sec = get_ulong(ifp);			///< bytes per second
		chbytes_per_sample = get_ushort(ifp);	///< bytes per sample
		bitlength = get_ushort(ifp);			///< bit length
		
		fclose( ifp );
		
		Message_printf( TEXT("%s	%10d	%dHz %dbit %dch"), _pFileNameId, len, samplingfreq, bitlength, mono1_stereo2 );
	}else
	{
		Message_printf( TEXT("%s not read"), _pFileNameId );
	}
	
}

unsigned long FILECHECK::get_ulong(FILE *_f)
{
	unsigned char ss[4];
	unsigned res;
	
	if (fread(ss, 4, 1, _f) != 1) {
		res = 0;
	} else {
		res = ss[0] + 256LU * (ss[1] + 256LU * (ss[2] + 256LU * ss[3]));
	}
	return res;
}

unsigned FILECHECK::get_ushort(FILE *_f)
{
	unsigned char ss[2];
	unsigned res;
	
	if (fread(ss, 2, 1, _f) != 1) {
		res = 0;
	} else {
		res = ss[0] + 256U * ss[1];
	}
	return res;
}


//********************************************************************************************
/**
 * @brief		ビットマップ情報の取得.
 * @author		N.Takeda
 *
 * @param[in]	LPCTSTR	_filename	ファイル名.
 *
 * @return		なし (none)
 */
//********************************************************************************************
void	FILECHECK::get_bmpinfo( LPCTSTR _filename )
{
	TCHAR	name[_MAX_FNAME],ext[_MAX_EXT];
	char	*mem=NULL;
	BMPINFO bmp;
	int		len;
	
	
	len = MEM_TargetRead( &mem, _filename );
	if(len > 0){
 		bmp = BMP_GetRECTinfo(mem);
		
		FILE_split( _filename, NULL, NULL, name, ext );
	//	Message_printf(TEXT("%16d	wh(%3d,%3d)%2dbit %s%s"),len,bmp.Width,bmp.Height,bmp.BitCount,name,ext);
		Message_printf(TEXT("%s%s	wh(%3d,%3d)%2dbit	%8dKb"),name,ext,bmp.Width,bmp.Height,bmp.BitCount,(len+1023)/1024);
		
		mem_del(mem);
	}else{
		Message_printf(TEXT("not found. %s%s"),name,ext);
	}
	
}


#if 0
void	FILECHECK::get_hepinfo( LPCTSTR _filename )
{
	TCHAR	name[_MAX_FNAME],ext[_MAX_EXT];
	char	*mem=NULL;
	int		len;
	TEXTURE_HEADER	*info;
	TCHAR	err[] = TEXT(" *");
	int		er;
	
	len = MEM_TargetRead( &mem, _filename );
	if(len > 0){
		info = (TEXTURE_HEADER*)mem;
 		
 		er = 0;
 		if((info->width % 8) != 0)	er = 1;
 		
		FILE_split( _filename, NULL, NULL, name, ext );
	//	Message_printf(TEXT("%16d	wh(%3d,%3d)%2dbit %s%s"),len,info->width,info->hight,info->format_id,name,ext);
		Message_printf( TEXT("%s%s	%cwh(%3d,%3d)0x%2x	%8dKb"), name, ext, err[er], info->width, info->hight, info->format_id, (len+1023)/1024 );
		
		mem_del(mem);
	}else{
		Message_printf( TEXT("not found. %s%s"), name, ext );
	}
	
}
#endif


//********************************************************************************************
/**
 * @brief		その他のファイル情報.
 * @author		N.Takeda
 *
 * @param[in]	LPCTSTR	_filename	ファイル名.
 *
 * @return		なし (none)
 */
//********************************************************************************************
void	FILECHECK::etc_file( LPCTSTR _filename )
{
	TCHAR	name[_MAX_FNAME],ext[_MAX_EXT];
	int		len;
	
	
	len = FILE_GetFileSize(_filename);
	if(len > 0){
		FILE_split( _filename, NULL, NULL, name, ext );
		Message_printf( TEXT("%s%s	%10d"), name, ext, len );
	//	Message_printf(TEXT("%16d	%s%s"), len, name, ext );
	}else{
		Message_printf( TEXT("not found. %s%s"), name, ext );
	}
	
}


//------------------------------------------------------------------
//	変換フィルターサンプル　機能:無変換(ファイルコピー)
//			変換せず調査だけなら out に関する部分は不要
//------------------------------------------------------------------
int		FILECHECK::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	LPCTSTR	sPath;
	TCHAR	drive[_MAX_DRIVE], dir[_MAX_DIR], name[_MAX_FNAME], ext[_MAX_EXT];
	
	
	sPath		= cParam.GetPath();		///< ターゲットファイル (GetFilePath(0)としても同じ).
	
	Initialize();
	
	FILE_split( sPath, drive, dir, name, ext );
	STRING_ToBig( ext );
	
	if( STRING_cmp( ext, TEXT(".WAV") )==0){
		GetWavInfo( sPath );
	}else if( STRING_cmp( ext, TEXT(".BMP") )==0){
		get_bmpinfo( sPath );
#if 0
	}else if( STRING_cmp( ext, TEXT(".HEP") )==0){
		get_hepinfo( sPath );
#endif
	}else{
		etc_file( sPath );
	}
	
	return TRUE;
}


FILECHECK	*pC_filecheck = NULL;
