//==============================================================================================================================
/**
	@file	filecopy.cpp
	@brief	ファイル／フォルダのコピー
	@date	2008/05/14	T.Kujyo	新規作成.

	ファイル／フォルダのコピー.
 */
//==============================================================================================================================

//------------------------------------------------------------------
/**
	スクリプトコマンドクラス.
*/
//------------------------------------------------------------------
class FILECOPY
{
	BOOL		m_bInitialized;
	BOOL		m_bImplemented;
	BOOL		m_bFullInit;
	
	void		Initialize();
	
public:
	int			Func( LPCTSTR _sParamString );
	void		Quit( BOOL _bExit );
	
	FILECOPY();
	~FILECOPY();
	
};

///	アプリケーション起動時.
FILECOPY::FILECOPY()
	: m_bFullInit( FALSE )
	, m_bInitialized( FALSE )
	, m_bImplemented( FALSE )
{
	
}
///	アプリケーション終了時.
FILECOPY::~FILECOPY()
{
}


//==============================================================================================================================================
/**
	初期化と開放.
		1ファイルに1つの処理でコンプリートするような場合は修正する必要ありません
		注釈となっている Message_printf を有効にして sample.swb を実行すると動きがよく分かると思います。
*/
//==============================================================================================================================================

//------------------------------------------------------------------
/**
	スクリプトコマンドの初期化.
	(特に必要ないなら変更の必要なし)
*/
//------------------------------------------------------------------
void	FILECOPY::Initialize()
{
	if( m_bInitialized == TRUE )	return;
	m_bInitialized = TRUE;	//	初期済みフラグ
	
	if( m_bFullInit == FALSE ){
		m_bFullInit = TRUE;
		//	全体を通して一度しか行わない初期化
		
		Message_win( TEXT("copying") );
	}
	
	//	初期化処理
	//	１つのバッチに同じスクリプトが２度指定されていたならここには２度来る
	//Message_printf("初期化");
	
	
}

//------------------------------------------------------------------
/**
スクリプトコマンドの終了.
	(特に必要ないなら変更の必要なし)
*/
//------------------------------------------------------------------
void	FILECOPY::Quit( BOOL _bExit )
{
	//	ここにはスクリプトを使っていなくても来るので注意
	
	if( m_bImplemented == FALSE )	return;		///<変換処理が実行されていないなら帰還.
	m_bImplemented = FALSE;
	m_bInitialized = FALSE;
	
	///	終了処理.
	//Message_printf("完了");
	
	if( _bExit == TRUE )
	{
		//	次のスクリプトは存在しない、完全な終了
		//	１つのバッチに同じスクリプトに別パラメータを渡しての処理で
		//	逐一結果を出さず、全体で統合して結果を出したい場合などはここで
		
		//Message_printf("終了");
		
	}
	
}







//==============================================================================================================================================
//	変換処理部分
//==============================================================================================================================================

#define	FILECOPY_OUTAREA		2	///< 変換後の容量は仮に元の倍取っている　内容によって変更して下さい.
#define	FILECOPY_RANGE				///< このdefineを有効にすると範囲限定機能が有効になる.

//------------------------------------------------------------------
/**
変換フィルターサンプル　機能:無変換(ファイルコピー).
	変換せず調査だけなら out に関する部分は不要
*/
//------------------------------------------------------------------
int		FILECOPY::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	char		*pMem = NULL;
	int			iLen, ii, iOpt;
	xstring		sPath;
	xstring		sOutPath;
	T_FILETIME	stFTime;
	
	
	sPath    = cParam.GetPath();
//	sOutPath = cParam.GetOutPath();
	sOutPath = cParam.GetString( 1 );
	const TCHAR		sRootOptionSymble = 'r';
	
	
	Initialize();
	
	
	if( sOutPath.empty() )	return FALSE;
	
	m_bImplemented = TRUE;	///<	実行済みフラグon.
	
	
	/// 入力ファイルの最初の '\'より前を指定出力フォルダに入れ替え.
	iOpt = cParam.SearchOption( sRootOptionSymble );
	if( -1 != iOpt )
	{
		TCHAR	sOptStr[ MAX_PATH ];
		TCHAR	sPathStr[ MAX_PATH ];
		
		STRING_cpy( sOptStr, cParam.GetStringOption( sRootOptionSymble ) );
		STRING_ToBig( sOptStr );
		STRING_cpy( sPathStr, sPath.c_str() );
		STRING_ToBig( sPathStr );
		
		LPCTSTR	pp = STRING_str( sPathStr, sOptStr );
		
		if( pp )
		{
			sOutPath.append( sPath.c_str() + ( pp - sPathStr ) + STRING_len( sOptStr ) );
		}
		
	}
	else
	{
		ii = sPath.find_first_of( TEXT("\\") );
		
		if( ii != string::npos )
		{
			sOutPath.append( sPath, ii, sPath.size()-ii );
		}
	}
	
	iLen = MEM_TargetRead( &pMem, sPath.c_str() );
	if( iLen == 0 )
	{
		Message_printf( TEXT("not found. %s"), pickup_name(sPath.c_str()) );
		return 0;
	}
	
	FILE_GetTime( sPath.c_str(), &stFTime );
	
	FILE_MakeDirectory( sOutPath.c_str() );
	iLen = FILE_TargetWrite( sOutPath.c_str(), pMem, iLen );
	if( iLen == 0 )
	{
		Message_printf( TEXT("copy failed. %s"), sOutPath.c_str() );
	}
	FILE_SetTime( sOutPath.c_str(), &stFTime );
	
	Message_printf( TEXT("copy %s->%s"), pickup_name( sPath.c_str() ), sOutPath.c_str() );
	
	del_alloc( pMem );
	
	return TRUE;
}


FILECOPY	*pC_filecopy = NULL;

