//********************************************************************************************
/**
 * @file		rlsPress.cpp
 * @brief		RLS圧縮
 *
	もっとも単純な構造のサンプルプログラム.
 *
	@date		2013/05/14	takedan	新規作成.
 */
//********************************************************************************************

#define	SW_MODULE_RLSPRESS						///< この機能を切り離したい時はコメントアウト.
#ifdef	SW_MODULE_RLSPRESS

#ifndef _STOOLS_H
#include <press/rls.h>
#endif

//********************************************************************************************
/**
 * @class		RLSPRESS
 * @brief		RLS圧縮スクリプトコマンドクラス.
 */
//********************************************************************************************
class RLSPRESS
{
public:
	virtual int		Func( LPCTSTR _sParamString );
	virtual void	Quit( BOOL _bExit ){}
};



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

#define	RLSPRESS_OUTAREA		2	//	変換後の容量は仮に元の倍取っている　内容によって変更して下さい

//********************************************************************************************
/**
 * @brief		RLS圧縮変換フィルターサンプル　機能:無変換(ファイルコピー)
 *				変換せず調査だけなら pOut に関する部分は不要.
 *
 * @param[in]	LPCTSTR	_sParamString	引数文字列  ターゲットファイル名 + スクリプトで指定する引数.
 *
 * @return		int	TRUE:成 / FALSE:否(デフォルト)
 */
//********************************************************************************************
int		RLSPRESS::Func( LPCTSTR _sParamString )
{
	CSwbParam	cParam( _sParamString );							///< パラメータ処理.
	
	struct StHead
	{
		Char	m_sId[4];
		Char	m_sExt[4];
		Int32	m_iLength;
	};
	
	char	*pMem = NULL;
	char	*pOut = NULL;
	Int32	iSourceLength;
	UInt32	iLength;
	LPCTSTR	szFileName, szOutName;
	StHead	stHead;
	
	
	/// 引数の取り出し.
	szFileName = cParam.GetPath();		///< ターゲットファイル (GetString(0)としても同じ).
	szOutName  = cParam.GetOutPath();	///< 出力パスを取得(%0等は変換されている).
	
	
	/// 元データ読み込み(関数内部でpMemに領域を確保している).
	iSourceLength = MEM_TargetRead( &pMem, szFileName );						///< バイナリーデータとしてベタ読み.
	if(iSourceLength == 0)	return FALSE;		///< ファイルがない.
	
	
	/// 変換後のデータバッファを確保	元データがあまりに小さい場合があるので最低1KBは確保.
	mem_alloc( char, pOut, ((iSourceLength*RLSPRESS_OUTAREA+1023)/1024)*1024 );
	
	if( 1 > RLS_encodeDWORD( pMem, pOut + sizeof(StHead), &iLength, TRUE, iSourceLength ) )	//!< ヘッダー部分を開けて作成.
	{
		Message_error( TEXT("error %s"), szFileName );
	}else{
		Message_printf( TEXT("%s %3d%%"), szFileName, (Int32)((Float32)iLength * 100.f / (Float32)iSourceLength) );
	}
	
	
	/// 変換された pOut を出力　　出力ファイル名はバッチで指定、特に指定されていなければ元と同じファイル名.
	{
		TCHAR	cDrive[_MAX_DRIVE], cDir[_MAX_DIR], cName[_MAX_FNAME], cExt[_MAX_EXT], szTemp[_MAX_PATH];
		CTOSJIS	cJis;
		
		FILE_split( szOutName, cDrive, cDir, cName, cExt );
		FILE_merge( szTemp, cDrive, cDir, cName, TEXT(".rls") );	///<拡張子を".txt"に変えるサンプル.
		
		//! ヘッダー追加.
		stHead.m_sId[0] = 'R';
		stHead.m_sId[1] = 'L';
		stHead.m_sId[2] = 'S';
		stHead.m_sId[3] = 0;
#ifdef _UNICODE
		memcpy( stHead.m_sExt, cJis.From(cExt+(cExt[0]=='.')), 4 );
#endif	// _UNICODE
		stHead.m_iLength = iSourceLength;
		memcpy( pOut, (Char*)&stHead, sizeof(StHead) );
		iLength += sizeof(StHead);
		
		/// ファイル出力(同名が存在する時はバックアップが作成される).
		file_targetwrite( szTemp, pOut, iLength );			///< 出力.
	}
	
	
	/// メモリを開放.
	mem_del( pMem );
	mem_del( pOut );
	
	return TRUE;
}


RLSPRESS	*pC_rlsPress = NULL;

#endif	// SW_MODULE_RLSPRESS
