File Annotation

Not logged in
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: }