13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: #include "stdafx.h" 13b7203622 2011-02-23 kinaba: #include "ArcAce.h" 13b7203622 2011-02-23 kinaba: #include "NoahApp.h" 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int CArcAce::v_load() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( hDLL = kiSUtil::loadLibrary("UnAceV2") ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( (aceInit = (FI)::GetProcAddress( hDLL,"ACEInitDll" )) 13b7203622 2011-02-23 kinaba: && (aceHead = (FR)::GetProcAddress( hDLL,"ACEReadArchiveData" )) 13b7203622 2011-02-23 kinaba: && (aceList = (FL)::GetProcAddress( hDLL,"ACEList" )) 13b7203622 2011-02-23 kinaba: && (aceTest = (FT)::GetProcAddress( hDLL,"ACETest" )) 13b7203622 2011-02-23 kinaba: && (aceExtr = (FE)::GetProcAddress( hDLL,"ACEExtract" )) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: tACEInitDllStruc ini; 13b7203622 2011-02-23 kinaba: ki_memzero( &ini, sizeof(ini) ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ini.GlobalData.Obj = this; 13b7203622 2011-02-23 kinaba: ini.GlobalData.MaxArchiveTestBytes = 0x2ffFF; 13b7203622 2011-02-23 kinaba: ini.GlobalData.MaxFileBufSize = 0x2ffFF; 13b7203622 2011-02-23 kinaba: ini.GlobalData.InfoCallbackProc = callback_info; 13b7203622 2011-02-23 kinaba: ini.GlobalData.ErrorCallbackProc = callback_error; 13b7203622 2011-02-23 kinaba: ini.GlobalData.RequestCallbackProc = callback_request; 13b7203622 2011-02-23 kinaba: ini.GlobalData.StateCallbackProc = callback_state; 13b7203622 2011-02-23 kinaba: ini.GlobalData.DecryptPassword = pwdBuf; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( 0 == aceInit( &ini ) ) 13b7203622 2011-02-23 kinaba: return aCheck|aMelt|aList|aMeltEach; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ::FreeLibrary( hDLL ); 13b7203622 2011-02-23 kinaba: hDLL = NULL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: return 0; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool CArcAce::v_ver( kiStr& str ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: str = "UnAceV2.dll "; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- 存在確認 13b7203622 2011-02-23 kinaba: char buf[40]; 13b7203622 2011-02-23 kinaba: if( hDLL ) 13b7203622 2011-02-23 kinaba: if( GetVersionInfoStr( "UnAceV2", buf, sizeof(buf) ) ) 13b7203622 2011-02-23 kinaba: str += buf; 13b7203622 2011-02-23 kinaba: else 13b7203622 2011-02-23 kinaba: str += "OK!"; 13b7203622 2011-02-23 kinaba: else 13b7203622 2011-02-23 kinaba: str += "----"; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool CArcAce::v_check( const kiPath& aname ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: //-- 書庫情報を読み込んでみる 13b7203622 2011-02-23 kinaba: tACEReadArchiveDataStruc dt; 13b7203622 2011-02-23 kinaba: ki_memzero( &dt, sizeof(dt) ); 13b7203622 2011-02-23 kinaba: return ( 0==aceHead( const_cast<char*>((const char*)aname), &dt ) 13b7203622 2011-02-23 kinaba: && NULL!=dt.ArchiveData ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool CArcAce::v_list( const arcname& aname, aflArray& files ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: list = &files; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- リスティング開始! 13b7203622 2011-02-23 kinaba: tACEListStruc lst; 13b7203622 2011-02-23 kinaba: ki_memzero( &lst, sizeof(lst) ); 13b7203622 2011-02-23 kinaba: lst.Files.SourceDir = ""; 13b7203622 2011-02-23 kinaba: lst.Files.FileList = "*"; 13b7203622 2011-02-23 kinaba: lst.Files.ExcludeList = ""; 13b7203622 2011-02-23 kinaba: lst.Files.FullMatch = FALSE; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: char anm[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ki_strcpy( anm, aname.basedir ); 13b7203622 2011-02-23 kinaba: ki_strcat( anm, aname.lname ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return ( 0==aceList( anm, &lst ) ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int CArcAce::v_contents( const kiPath& aname, kiPath& dname ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: list = NULL; 13b7203622 2011-02-23 kinaba: aCnt = aUnknown; 13b7203622 2011-02-23 kinaba: dName = &dname; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- リスティング開始! 13b7203622 2011-02-23 kinaba: tACEListStruc lst; 13b7203622 2011-02-23 kinaba: ki_memzero( &lst, sizeof(lst) ); 13b7203622 2011-02-23 kinaba: lst.Files.SourceDir = ""; 13b7203622 2011-02-23 kinaba: lst.Files.FileList = "*"; 13b7203622 2011-02-23 kinaba: lst.Files.ExcludeList = ""; 13b7203622 2011-02-23 kinaba: lst.Files.FullMatch = TRUE; 13b7203622 2011-02-23 kinaba: if( 0!=aceList( const_cast<char*>((const char*)aname), &lst ) ) 13b7203622 2011-02-23 kinaba: return aMulti; 13b7203622 2011-02-23 kinaba: return aCnt; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int CArcAce::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: pathCheck = new CArcPathCheckDlg; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- 渡すファイルリスト作成 13b7203622 2011-02-23 kinaba: kiStr lst; 13b7203622 2011-02-23 kinaba: if( files ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: dlg = NULL; 13b7203622 2011-02-23 kinaba: for( unsigned int i=0; i!=list->len(); i++ ) 13b7203622 2011-02-23 kinaba: if( (*files)[i].selected ) 13b7203622 2011-02-23 kinaba: lst += (*files)[i].inf.szFileName, lst += '\xd'; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: else 13b7203622 2011-02-23 kinaba: lst = "*", dlg = new CArcProgressDlg( 32768 ); 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: m_aname = aname.lname; 13b7203622 2011-02-23 kinaba: pwdBuf[0] = -1; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: tACEExtractStruc ex; 13b7203622 2011-02-23 kinaba: ki_memzero( &ex, sizeof(ex) ); 13b7203622 2011-02-23 kinaba: ex.Files.SourceDir = ""; 13b7203622 2011-02-23 kinaba: ex.Files.FileList = const_cast<char*>((const char*)lst); 13b7203622 2011-02-23 kinaba: ex.Files.ExcludeList = ""; 13b7203622 2011-02-23 kinaba: ex.Files.FullMatch = files==NULL; 13b7203622 2011-02-23 kinaba: ex.DestinationDir = const_cast<char*>((const char*)ddir); 13b7203622 2011-02-23 kinaba: ex.ExcludePath = FALSE; 13b7203622 2011-02-23 kinaba: ex.DecryptPassword = ""; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: char anm[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ki_strcpy( anm, aname.basedir ); 13b7203622 2011-02-23 kinaba: ki_strcat( anm, aname.lname ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: m_bCanceled = false; 13b7203622 2011-02-23 kinaba: bool ans = ( 0==aceExtr( anm, &ex ) ); 13b7203622 2011-02-23 kinaba: if( dlg && ans ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: dlg->change(NULL,32768); 13b7203622 2011-02-23 kinaba: ::Sleep(100); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: delete dlg; 13b7203622 2011-02-23 kinaba: delete pathCheck; 13b7203622 2011-02-23 kinaba: return ans ? 0 : (m_bCanceled?0x8020:0xffff); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int __stdcall CArcAce::callback_error( pACEErrorCallbackProcStruc Error ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_OK; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int __stdcall CArcAce::callback_info( pACEInfoCallbackProcStruc Info ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_OK; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int __stdcall CArcAce::callback_request( pACERequestCallbackProcStruc Request ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // パスワード要求@解凍 ... ArchivedFile 13b7203622 2011-02-23 kinaba: if( Request->Global.Code == ACE_CALLBACK_REQUEST_PASSWORD 13b7203622 2011-02-23 kinaba: && Request->Global.Operation == ACE_CALLBACK_OPERATION_EXTRACT ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: CArcAce* ace = (CArcAce*)(Request->Global.GlobalData->Obj); 13b7203622 2011-02-23 kinaba: if( ace->pwdBuf[0] == -1 ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ace->pwdBuf[0]=0; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: CArcPwdDlg pwd( ace->dlg ? ace->dlg->hwnd() : NULL, ace->pwdBuf, 60, ace->m_aname ); 13b7203622 2011-02-23 kinaba: if( IDCANCEL == pwd.getEndCode() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ace->m_bCanceled = true; 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_CANCEL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: Request->Global.GlobalData->DecryptPassword = ace->pwdBuf; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( Request->Global.Code == ACE_CALLBACK_REQUEST_CHANGEVOLUME ) 13b7203622 2011-02-23 kinaba: if( !kiSUtil::exist(Request->Archive.ArchiveData->ArchiveName) ) 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_CANCEL; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_OK; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int __stdcall CArcAce::callback_state( pACEStateCallbackProcStruc State ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // ファイル処理開始@解凍orリスト 13b7203622 2011-02-23 kinaba: if( State->Progress.Code == ACE_CALLBACK_STATE_STARTFILE ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: CArcAce* ptr = (CArcAce*)(State->ArchivedFile.GlobalData->Obj); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( State->Progress.Operation == ACE_CALLBACK_OPERATION_LIST ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( !ptr->listup( *(State->ArchivedFile.FileData) ) ) 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_CANCEL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: else if( State->Progress.Operation == ACE_CALLBACK_OPERATION_EXTRACT ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( ptr->dlg ) 13b7203622 2011-02-23 kinaba: ptr->dlg->change( State->ArchivedFile.FileData->SourceFileName ); 13b7203622 2011-02-23 kinaba: if( ptr->pathCheck ) 13b7203622 2011-02-23 kinaba: if( containsDangerPath( State->ArchivedFile.FileData->SourceFileName ) ) 13b7203622 2011-02-23 kinaba: if( ! ptr->pathCheck->is_ok_to_extract( State->ArchivedFile.FileData->SourceFileName, ptr->dlg ) ) 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_CANCEL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: // 進展状況グラフ@解凍 13b7203622 2011-02-23 kinaba: else if( State->Progress.Code == ACE_CALLBACK_STATE_PROGRESS ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: CArcAce* ptr = (CArcAce*)(State->ArchivedFile.GlobalData->Obj); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( State->Progress.Operation == ACE_CALLBACK_OPERATION_EXTRACT && ptr->dlg ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: unsigned long prs = (unsigned long)State->Progress.ProgressData->TotalProcessedSize; 13b7203622 2011-02-23 kinaba: unsigned long ttl = (unsigned long)State->Progress.ProgressData->TotalSize; 13b7203622 2011-02-23 kinaba: ptr->dlg->change( NULL, ttl ? (int)((((__int64)prs)<<15)/ttl) : 10000 ); 13b7203622 2011-02-23 kinaba: if( !ptr->dlg->msgloop() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ptr->m_bCanceled = true; 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_CANCEL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: // CRCチェック@解凍 13b7203622 2011-02-23 kinaba: else if( State->Progress.Code == ACE_CALLBACK_STATE_ENDCRCCHECK ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( !State->CRCCheck.CRCOk ) 13b7203622 2011-02-23 kinaba: ::DeleteFile( State->CRCCheck.FileData->SourceFileName ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return ACE_CALLBACK_RETURN_OK; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool CArcAce::listup( tACEFileDataStruc& f ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( list ) // 全ファイルリスティングモード 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: arcfile x; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ki_strcpy( x.inf.szFileName, f.SourceFileName ); 13b7203622 2011-02-23 kinaba: x.isfile = ( 0== (f.Attributes & 0x10) ); //_A_SUBDIR 13b7203622 2011-02-23 kinaba: x.inf.dwCompressedSize = (unsigned long)f.CompressedSize; 13b7203622 2011-02-23 kinaba: x.inf.dwOriginalSize = (unsigned long)f.Size; 13b7203622 2011-02-23 kinaba: x.inf.wDate = (unsigned short)(f.Time>>16); 13b7203622 2011-02-23 kinaba: x.inf.wTime = (unsigned short)(f.Time); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( f.Method==0 ) ki_strcpy( x.inf.szMode, "store" ); 13b7203622 2011-02-23 kinaba: else if( f.Method&2 ) ki_strcpy( x.inf.szMode, "ace2" ); 13b7203622 2011-02-23 kinaba: else if( f.Method&1 ) ki_strcpy( x.inf.szMode, "ace1" ); 13b7203622 2011-02-23 kinaba: else ki_strcpy( x.inf.szMode, "-ace-" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: list->add( x ); 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 書庫内ファイル構成検索モード 13b7203622 2011-02-23 kinaba: for( const char* p=f.SourceFileName; *p; p=kiStr::next(p) ) 13b7203622 2011-02-23 kinaba: if( *p=='\\' || *p=='/' ) 13b7203622 2011-02-23 kinaba: return true; // ルートのファイルのみ処理対象… 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( aCnt != aUnknown ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: aCnt = (f.Attributes & 0x10) ? aSingleDir : aSingleFile; 13b7203622 2011-02-23 kinaba: if( aCnt == aSingleDir ) 13b7203622 2011-02-23 kinaba: *dName = f.SourceFileName; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: }