File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include "stdafx.h"
13b7203622 2011-02-23        kinaba: #include "ArcDLL.h"
13b7203622 2011-02-23        kinaba: #include "NoahApp.h"
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcDLL::v_load()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// DLLの存在確認
13b7203622 2011-02-23        kinaba: 	if( !dll.exist() )
13b7203622 2011-02-23        kinaba: 		return 0;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 圧縮メソッドリストを設定
13b7203622 2011-02-23        kinaba: 	DWORD cp = set_cmpr_mhd();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// Abiltyを返す
13b7203622 2011-02-23        kinaba: 	return (m_Ecmd ? aCheck|aMelt : 0) | (m_Xcmd ? aList|aMeltEach : 0) | cp | (m_Scmd ? aSfx : 0);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcDLL::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 出力先をカレントに
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory( ddir );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 解凍コマンド
13b7203622 2011-02-23        kinaba: 	kiStr cmd = ( !files || files->len()==0 ) ? m_Ecmd : m_Xcmd;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 書庫名
13b7203622 2011-02-23        kinaba: 	cmd += " \"", cmd += aname.basedir, cmd += aname.lname, cmd += "\" \"";
13b7203622 2011-02-23        kinaba: 	// 出力先ディレクトリ
13b7203622 2011-02-23        kinaba: 	cmd += ddir, cmd += '"';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ( もしあれば )ファイルリスト
13b7203622 2011-02-23        kinaba: 	if( files )
13b7203622 2011-02-23        kinaba: 		for( unsigned int i=0; i!=files->len(); i++ )
13b7203622 2011-02-23        kinaba: 			if( (*files)[i].selected )
13b7203622 2011-02-23        kinaba: 				cmd += " \"",
13b7203622 2011-02-23        kinaba: 				decorate_add_melt( cmd, (*files)[i].inf.szFileName ),
13b7203622 2011-02-23        kinaba: 				cmd += '"';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// コマンド実行!
13b7203622 2011-02-23        kinaba: 	return dll.cmd( cmd );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int  CArcDLL::v_compress( const kiPath&	  base,
13b7203622 2011-02-23        kinaba: 						  const wfdArray& files,
13b7203622 2011-02-23        kinaba: 						  const kiPath&   ddir,
13b7203622 2011-02-23        kinaba: 						  const int       method,
13b7203622 2011-02-23        kinaba: 						  const bool      sfx )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 基底はカレント
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory( base );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// ファイル名リスト作成
13b7203622 2011-02-23        kinaba: 	kiStr lst;
13b7203622 2011-02-23        kinaba: 	for( unsigned int i=0; i!=files.len(); i++ )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		lst += '"';
13b7203622 2011-02-23        kinaba: 		decorate_add_cmpr( lst, files[i].cFileName );
13b7203622 2011-02-23        kinaba: 		if( files[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
13b7203622 2011-02-23        kinaba: 			if( m_Wild==1 )
13b7203622 2011-02-23        kinaba: 				lst += "\\*";
13b7203622 2011-02-23        kinaba: 			else if( m_Wild==2 )
13b7203622 2011-02-23        kinaba: 				lst += "\\*.*";
13b7203622 2011-02-23        kinaba: 		lst += "\" ";
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 書庫名作成
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// Ver 3.14 -- フォルダなら拡張子を除かない
13b7203622 2011-02-23        kinaba: 	//  b2eの方は今更どーしようもないので、ここだけ変更
13b7203622 2011-02-23        kinaba: 	// Ver 3.19 -- 削る拡張子は一個だけ
13b7203622 2011-02-23        kinaba: 	kiStr aname;
13b7203622 2011-02-23        kinaba: 	if( files[0].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		aname = kiPath::name( files[0].cFileName );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		switch(mycnf().extnum())
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 		case 0: aname = files[0].cFileName;break;
13b7203622 2011-02-23        kinaba: 		case 1: kiPath(files[0].cFileName).getBody_all(aname);break;
13b7203622 2011-02-23        kinaba: 		default:kiPath(files[0].cFileName).getBody(aname);break;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 圧縮!
13b7203622 2011-02-23        kinaba: 	if( sfx )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		kiPath tmp;
13b7203622 2011-02-23        kinaba: 		myapp().get_tempdir( tmp );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		kiPath tsfx(tmp);  tsfx+=aname; tsfx+=".exe";
13b7203622 2011-02-23        kinaba: 		kiPath rsfx(ddir); rsfx+=aname; rsfx+=".exe";
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		int ans = cmpr( method, aname, tmp, lst );
13b7203622 2011-02-23        kinaba: 		if( ans < 0x8000 )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			ans = 0x8020;
13b7203622 2011-02-23        kinaba: 			::SetCurrentDirectory( tmp );
13b7203622 2011-02-23        kinaba: 			if( arc2sfx( aname ) )
13b7203622 2011-02-23        kinaba: 				if( ::CopyFile( tsfx, rsfx, FALSE ) )
13b7203622 2011-02-23        kinaba: 					ans = 0;
13b7203622 2011-02-23        kinaba: 			// カレントを戻しておかないとあとで削除できない…
13b7203622 2011-02-23        kinaba: 			::SetCurrentDirectory( base );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		tmp.remove();
13b7203622 2011-02-23        kinaba: 		return ans;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		return cmpr( method, aname, ddir, lst );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcDLL::cmpr( int mhd, kiStr& aname,const kiPath& to,const kiStr& lst )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	aname += '.', aname+=get_cmpr_ext(mhd);
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiStr cmd = get_cmpr_cmd(mhd);
13b7203622 2011-02-23        kinaba: 	cmd += " \"";
13b7203622 2011-02-23        kinaba: 	cmd += to;
13b7203622 2011-02-23        kinaba: 	cmd += aname;
13b7203622 2011-02-23        kinaba: 	cmd += "\" ";
13b7203622 2011-02-23        kinaba: 	cmd += lst;
13b7203622 2011-02-23        kinaba: 	return dll.cmd( cmd );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcDLL::arc2sfx( const kiStr& aname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiStr cmd=m_Scmd; cmd+=" \"", cmd+=aname, cmd+='"';
13b7203622 2011-02-23        kinaba: 	return 0x8000>dll.cmd( cmd );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcDLL::decorate_add_cmpr( kiStr& lst, const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	lst += fname;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcDLL::decorate_add_melt( kiStr& lst, const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	lst += fname;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcDLL_DotSlash::decorate_add_cmpr( kiStr& lst, const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 先頭 - や @ 対策に、.\\ でエスケープする
13b7203622 2011-02-23        kinaba: 	if( *fname=='-' || *fname=='@' )
13b7203622 2011-02-23        kinaba: 		lst += ".\\";
13b7203622 2011-02-23        kinaba: 	lst += fname;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcLzh::decorate_add_cmpr( kiStr& lst, const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// UNLHA32.DLL にはこの問題回避用のオプション -gb が。
13b7203622 2011-02-23        kinaba: 	if( *fname=='-' )
13b7203622 2011-02-23        kinaba: 		lst += "-gb";
13b7203622 2011-02-23        kinaba: 	lst += fname;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcLzh::decorate_add_melt( kiStr& lst, const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// UNLHA32.DLL にはこの問題回避用のオプション -gb が。
13b7203622 2011-02-23        kinaba: 	if( *fname=='-' )
13b7203622 2011-02-23        kinaba: 		lst += "-gb";
13b7203622 2011-02-23        kinaba: 	lst += fname;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void CArcZip::decorate_add_cmpr( kiStr& lst, const char* fname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 先頭 - や @ 対策に、[-] [@] と置換する
13b7203622 2011-02-23        kinaba: 	if( *fname=='-' || *fname=='@' )
13b7203622 2011-02-23        kinaba: 		lst+='[', lst+=*fname++, lst+=']';
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 途中の [ を [[] に置換する
13b7203622 2011-02-23        kinaba: 	while( *fname )
13b7203622 2011-02-23        kinaba: 		if( kiStr::isLeadByte(*fname) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			lst += *fname++, lst += *fname++;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			lst += *fname;
13b7203622 2011-02-23        kinaba: 			if( *fname++=='[' )
13b7203622 2011-02-23        kinaba: 				lst += "[]";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArcLzh::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "lzh" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "lh5" ), add_cmp_mhd( "lh6" ), add_cmp_mhd( "lh7" );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcLzh::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	static char cmd[] = "a -d -jso1 -- -jm2";
13b7203622 2011-02-23        kinaba: 	cmd[ sizeof(cmd)-2 ] = (char)('2'+method);
13b7203622 2011-02-23        kinaba: 	return cmd;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArcZip::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "zip" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "store" ),
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "normal", true ), add_cmp_mhd( "password" );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcZip::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	switch( method )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	case 0: return "-rS0";
13b7203622 2011-02-23        kinaba: 	case 2: return "-rS9e";
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return "-rS9";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArcCab::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "cab" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "MSZIP" ), add_cmp_mhd( "LZX21",true );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcCab::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return method==0 ? "-a -r -mz" : "-a -r -ml:21";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArcTar::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "tar" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "normal" ), add_cmp_mhd( "gzip",true ), add_cmp_mhd( "bzip2" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "xz" ), add_cmp_mhd( "lzma" );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcTar::get_cmpr_ext( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	switch( method )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	case 1: return "tgz";
13b7203622 2011-02-23        kinaba: 	case 2: return "tbz";
13b7203622 2011-02-23        kinaba: 	case 3: return "tar.xz";
13b7203622 2011-02-23        kinaba: 	case 4: return "tar.lzma";
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return "tar";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcTar::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	switch( method )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	case 1: return "-cvz9 --";
13b7203622 2011-02-23        kinaba: 	case 2: return "-cvB --";
13b7203622 2011-02-23        kinaba: 	case 3: return "-cvJ9 --";
13b7203622 2011-02-23        kinaba: 	case 4: return "-cv --lzma=9 --";
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return "-cv --";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArcBga::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "bga" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "gzip" ), add_cmp_mhd( "bzip2",true );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcBga::get_cmpr_ext( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return method==0 ? "gza" : "bza";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcBga::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return "a -r -a";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArcYz1::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "yz1" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "normal" ), add_cmp_mhd( "password" );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArcYz1::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return method==0 ? "c --" : "c -p --";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool CArcRar::v_check( const kiPath& aname )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// Unrar.dll のバグ?のため、ファイルハンドルが解放されないことが
13b7203622 2011-02-23        kinaba: 	// あるので、自前のチェックルーチンを用いる
13b7203622 2011-02-23        kinaba: 	// # Subset of XacRett #39
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	bool ans=false;
13b7203622 2011-02-23        kinaba: 	kiFile rar;
13b7203622 2011-02-23        kinaba: 	if( !rar.open(aname) )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	unsigned char mark[10];
13b7203622 2011-02-23        kinaba: 	if( 10!=rar.read(mark,10) )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( mark[0]==0x52 && mark[1]==0x45 && mark[2]==0x7e && mark[3]==0x5e )
13b7203622 2011-02-23        kinaba: 		return true;
13b7203622 2011-02-23        kinaba: 	else if( mark[0]==0x52 && mark[1]==0x61 &&
13b7203622 2011-02-23        kinaba: 			 mark[2]==0x72 && mark[3]==0x21 &&
13b7203622 2011-02-23        kinaba: 			 mark[4]==0x1a && mark[5]==0x07 &&
13b7203622 2011-02-23        kinaba: 			 mark[6]==0x00 && mark[9]==0x73 )
13b7203622 2011-02-23        kinaba: 		return true;
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		unsigned char* mem=new unsigned char[0x20000];
13b7203622 2011-02-23        kinaba: 		int siz = rar.read( mem, 0x1FFF0 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		for( unsigned char* p=mem; p<mem+siz-9; p++ )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( *p!=0x52 )continue;
13b7203622 2011-02-23        kinaba: 			if( p[1]==0x45 && p[2]==0x7e && p[3]==0x5e &&
13b7203622 2011-02-23        kinaba: 				mem[18]==0x52 && mem[19]==0x53 &&
13b7203622 2011-02-23        kinaba: 				mem[20]==0x46 && mem[21]==0x58)
13b7203622 2011-02-23        kinaba: 				{ ans=true; break; }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			if( p[1]==0x61 && p[2]==0x72 && p[3]==0x21 &&
13b7203622 2011-02-23        kinaba: 				p[4]==0x1a && p[5]==0x07 && p[6]==0x00 &&
13b7203622 2011-02-23        kinaba: 				p[9]==0x73 )
13b7203622 2011-02-23        kinaba: 				{ ans=true; break; }
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 		delete [] mem;
13b7203622 2011-02-23        kinaba:     }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcRar::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// Unrarはコマンド指定でダイアログを消せないので、
13b7203622 2011-02-23        kinaba: 	// OwnerWindowを指定する
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( files && files->len() )
13b7203622 2011-02-23        kinaba: 		dll.own( app()->mainhwnd() );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	int ans = CArcDLL::v_melt( aname, ddir, files );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( files && files->len() )
13b7203622 2011-02-23        kinaba: 		dll.fre();
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	return ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArcUnZip::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// UnZip32.dllが妙なフォルダを作り出すバグ対策
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	int ans = CArcDLL::v_melt( aname, ddir, files );
13b7203622 2011-02-23        kinaba: 	dll.unload();
13b7203622 2011-02-23        kinaba: 	return ans;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArc7z::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "7z" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "LZMA", true );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "LZMA(std)" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "LZMA(fast)" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "PPMd" );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArc7z::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( m_SfxMode )
13b7203622 2011-02-23        kinaba: 		switch( method )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			case 0:  return "a -t7z -sfx -m0=LZMA -r0 -mx=9 --";
13b7203622 2011-02-23        kinaba: 			case 1:  return "a -t7z -sfx -m0=LZMA -r0 -mx=5 --";
13b7203622 2011-02-23        kinaba: 			case 2:  return "a -t7z -sfx -m0=LZMA -r0 -mx=1 --";
13b7203622 2011-02-23        kinaba: 			default: return "a -t7z -sfx -m0=PPMd -r0 -mx=9 --";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 		switch( method )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			case 0:  return "a -t7z -m0=LZMA -r0 -mx=9 --";
13b7203622 2011-02-23        kinaba: 			case 1:  return "a -t7z -m0=LZMA -r0 -mx=5 --";
13b7203622 2011-02-23        kinaba: 			case 2:  return "a -t7z -m0=LZMA -r0 -mx=1 --";
13b7203622 2011-02-23        kinaba: 			default: return "a -t7z -m0=PPMd -r0 -mx=9 --";
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArc7z::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	m_SfxMode = sfx; // 処理を横取りしてSFXモードを記憶
13b7203622 2011-02-23        kinaba: 	return CArcDLL::v_compress(base,files,ddir,method,false);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArc7z::get_cmpr_ext( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return m_SfxMode ? "exe" : "7z";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //----------------------------------------------------------------------//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: DWORD CArc7zZip::set_cmpr_mhd()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	set_cmp_ext( "zip" );
13b7203622 2011-02-23        kinaba: 	add_cmp_mhd( "7-zip", true );
13b7203622 2011-02-23        kinaba: 	return aCompress|aArchive;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: const char* CArc7zZip::get_cmpr_cmd( int method )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	return "a -tzip -r0 -mx=9 --";
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: int CArc7zZip::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	// 処理を横取りして通常圧縮
13b7203622 2011-02-23        kinaba: 	return CArcDLL::v_compress(base,files,ddir,method,false);
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: