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: