Пример #1
0
bool TestArchive(const std::list<CString> &rArcList,CConfigManager &ConfigManager)
{
	CArchiverDLLManager &ArchiverManager=CArchiverDLLManager::GetInstance();

	//XacRettはチェックが甘いため使わない

	//プログレスバー
	CProgressDialog dlg;
	int nFiles=rArcList.size();
	dlg.Create(NULL);
	dlg.SetTotalFileCount(nFiles);
	dlg.ShowWindow(SW_SHOW);


	std::list<CString>::const_iterator ite=rArcList.begin();
	const std::list<CString>::const_iterator end=rArcList.end();

	//テスト結果を格納する
	std::vector<ARCLOG> LogArray;
	for(;ite!=end;++ite){
		//プログレスバーを進める
		if(dlg.IsWindow())dlg.SetNextState(*ite);

		ARCLOG arcLog;
		arcLog.strFile=*ite;
		//アーカイバハンドラ取得
		//NOTE:DenyExtによる対象絞り込みは既に行われているので2回は行わない
		CArchiverDLL *Archiver=ArchiverManager.GetArchiver(*ite,NULL);

		if(!Archiver){
			//---対応するハンドラがなかった:原因を調査
			//通常のエラー
			arcLog.strMsg.Format(IDS_ERROR_ILLEGAL_HANDLER,*ite);
			arcLog.Result=TEST_NOTARCHIVE;

			//UNICODE関係のチェック
			if(!UtilCheckT2A(*ite)){
				//UNICODEに対応していないのにUNICODEファイル名のファイルを扱おうとした
				arcLog.strMsg+=_T("\r\n\r\n");
				arcLog.strMsg.AppendFormat(IDS_ERROR_UNICODEPATH);
			}
		}else{
			CString strTemp;
			arcLog.Result=Archiver->TestArchive(*ite,strTemp);
			arcLog.strMsg=Archiver->GetName();
			arcLog.strMsg+=_T("\r\n\r\n");
			arcLog.strMsg+=strTemp;
		}
		LogArray.push_back(arcLog);
	}
	//プログレスバーを閉じる
	if(dlg.IsWindow())dlg.DestroyWindow();

	//ログに表示
	CLogListDialog LogDlg(CString(MAKEINTRESOURCE(IDS_LOGINFO_OPERATION_TESTARCHIVE)));
	LogDlg.SetLogArray(LogArray);
	LogDlg.DoModal(::GetDesktopWindow());

	return true;
}
Пример #2
0
void OutputsWidget::openLogExplorer()
{
  openfluid::ui::common::LogExplorerDialog
    LogDlg(QString::fromStdString(openfluid::base::RunContextManager::instance()->getOutputDir()),this);

  LogDlg.setDirectoryVisible(false);

  LogDlg.exec();
}
Пример #3
0
int main(int argc, char** argv)
{
  try
  {
    INIT_OPENFLUID_APPLICATION_WITH_GUI(argc, argv);

    // translations management
    QString Lang = openfluid::base::PreferencesManager::instance()->getLang();

    QTranslator QtTranslator;
    QTranslator OpenFLUIDTranslator;
    if (Lang != "default")
    {
      // load provided default translations
      QtTranslator.load("qt_" + Lang.left(2) + ".qm",
                        QLibraryInfo::location(QLibraryInfo::TranslationsPath));

      // load provided OpenFLUID translations
      OpenFLUIDTranslator.load(
          QString(openfluid::config::TRANSLATIONS_FILEROOT.c_str()) + "-" + Lang + ".qm",
          QString(openfluid::base::Environment::getTranslationsDir().c_str()));
    }
    OPENFLUID_APPLICATION.installTranslator(&QtTranslator);
    OPENFLUID_APPLICATION.installTranslator(&OpenFLUIDTranslator);

// TODO remove the #if linux when icons problem on win32 will be solved
#if linux
    Q_INIT_RESOURCE(openfluiduicommon);
#endif

    QString LogDir;

    if (argc >= 2)
      LogDir = QString(argv[1]);
    else
      LogDir = QDir::currentPath();

    openfluid::ui::common::LogExplorerDialog LogDlg(LogDir);

    QRect ScreenRect = QApplication::desktop()->screenGeometry();
    LogDlg.resize(ScreenRect.width()*0.9,ScreenRect.height()*0.9);
    LogDlg.move((ScreenRect.width()-LogDlg.width())/2, (ScreenRect.height()-LogDlg.height())/2);

    LogDlg.show();

    return CLOSE_OPENFLUID_APPLICATION_WITH_GUI;
  }
  catch (std::bad_alloc & E)
  {
    std::cerr << "bad_alloc ERROR: " << E.what()
              << ". Possibly not enough memory available" << std::endl;
  }
  catch (std::bad_exception & E)
  {
    std::cerr << "bad_exception ERROR: " << E.what() << std::endl;
  }
  catch (std::bad_cast & E)
  {
    std::cerr << "bad_cast ERROR: " << E.what() << std::endl;
  }
  catch (std::exception & E)
  {
    std::cerr << "std ERROR: " << E.what() << std::endl;
  }
  catch (...)
  {
    std::cerr << "ERROR: " << "Unknown Error" << std::endl;
  }
}
Пример #4
0
bool Extract(std::list<CString> &ParamList,CConfigManager &ConfigManager,DLL_ID ForceDLL,LPCTSTR lpSpecificOutputDir,const CMDLINEINFO* lpCmdLineInfo)
{
	TRACE(_T("Function ::Extract() started.\n"));
	CConfigGeneral ConfGeneral;
	CConfigExtract ConfExtract;

	ConfGeneral.load(ConfigManager);
	ConfExtract.load(ConfigManager);

	//設定上書き
	if(lpCmdLineInfo){
		if(-1!=lpCmdLineInfo->OutputToOverride){
			ConfExtract.OutputDirType=lpCmdLineInfo->OutputToOverride;
		}
		if(-1!=lpCmdLineInfo->CreateDirOverride){
			ConfExtract.CreateDir=lpCmdLineInfo->CreateDirOverride;
		}
		if(-1!=lpCmdLineInfo->DeleteAfterProcess){
			ConfExtract.DeleteArchiveAfterExtract=lpCmdLineInfo->DeleteAfterProcess;
		}
	}

	//セマフォによる排他処理
	CSemaphoreLocker SemaphoreLock;
	if(ConfExtract.LimitExtractFileCount){
		SemaphoreLock.Lock(LHAFORGE_EXTRACT_SEMAPHORE_NAME,ConfExtract.MaxExtractFileCount);
	}

	UINT uFiles=ParamList.size();	//引数にあるファイルの数

	//プログレスバー
	CProgressDialog dlg;
	//メッセージループを回すためのタイマー
	int timer=NULL;
	if(uFiles>=2){	//ファイルが複数ある時に限定
		dlg.Create(NULL);
		dlg.SetTotalFileCount(uFiles);
		dlg.ShowWindow(SW_SHOW);
		timer=SetTimer(NULL,NULL,1000,UtilMessageLoopTimerProc);
	}

	//指定の出力先
	CPath pathSpecificOutputDir(lpSpecificOutputDir ? lpSpecificOutputDir : _T(""));

	std::vector<ARCLOG> LogArray;	//処理結果を保持
	bool bAllOK=true;	//すべて問題なく解凍されればtrue

	//解凍処理
	for(std::list<CString>::iterator ite_param=ParamList.begin();ite_param!=ParamList.end();++ite_param){
		//プログレスバーを進める
		if(dlg.IsWindow())dlg.SetNextState(*ite_param);

		ARCLOG arcLog;

		//メッセージループ
		while(UtilDoMessageLoop())continue;

		//アーカイバハンドラ取得
		//ここでUNICODE非対応DLLにユニコードファイル名を渡そうとした場合は弾かれる。そして、ここでは失敗の原因を解明できない
		CArchiverDLL *lpArchiver=CArchiverDLLManager::GetInstance().GetArchiver(*ite_param,ConfExtract.DenyExt,ForceDLL);
		if(!lpArchiver){
			//対応するハンドラがなかった
			arcLog.Result=EXTRACT_NOTARCHIVE;
			arcLog.strMsg.Format(IDS_ERROR_ILLEGAL_HANDLER,(LPCTSTR)*ite_param);
			arcLog.strFile=*ite_param;
			bAllOK=false;
			LogArray.push_back(arcLog);
			continue;
		}

		CPath pathOpenDir;		//ファイラが開くべきフォルダ
		//解凍実行
		bool bRet=ExtractOneArchive(ConfigManager,ConfGeneral,ConfExtract,lpArchiver,*ite_param,pathSpecificOutputDir,arcLog,pathOpenDir);
		//ログ保存
		LogArray.push_back(arcLog);

		if(!bRet){
			bAllOK=false;
		}else{
			//出力先フォルダを開く
			if(ConfExtract.OpenDir){
				if(ConfGeneral.Filer.UseFiler){
					//パラメータ展開に必要な情報
					std::map<stdString,CString> envInfo;
					MakeExpandInformationEx(envInfo,pathOpenDir,NULL);

					//コマンド・パラメータ展開
					CString strCmd,strParam;
					UtilExpandTemplateString(strCmd,ConfGeneral.Filer.FilerPath,envInfo);	//コマンド
					UtilExpandTemplateString(strParam,ConfGeneral.Filer.Param,envInfo);	//パラメータ
					ShellExecute(NULL, _T("open"), strCmd,strParam, NULL, SW_SHOWNORMAL);
				}else{
					//Explorerで開く
					UtilNavigateDirectory(pathOpenDir);
				}
			}

			//正常に解凍できた圧縮ファイルを削除orごみ箱に移動
			if(bRet && ConfExtract.DeleteArchiveAfterExtract){
				if(!ConfExtract.ForceDelete && lpArchiver->IsWeakErrorCheck()){
					//エラーチェック機構が貧弱なため、解凍失敗時にも正常と判断してしまうような
					//DLLを使ったときには明示的に指定しない限り削除させない
					MessageBox(NULL,CString(MAKEINTRESOURCE(IDS_MESSAGE_EXTRACT_DELETE_SKIPPED)),UtilGetMessageCaption(),MB_OK|MB_ICONINFORMATION);
				}else{
					//削除
					DeleteOriginalArchives(ConfExtract,*ite_param);
				}
			}
		}
	}
	//プログレスバーを閉じる
	if(dlg.IsWindow())dlg.DestroyWindow();
	//タイマーを閉じる
	if(timer)KillTimer(NULL,timer);

	//---ログ表示
	switch(ConfGeneral.LogViewEvent){
	case LOGVIEW_ON_ERROR:
		if(!bAllOK){
			if(1==uFiles){
				//ファイル一つだけの時はダイアログボックスで
				if(EXTRACT_CANCELED!=LogArray[0].Result){
					ErrorMessage(LogArray[0].strMsg);
				}
			}else{
				//ログに表示
				CLogListDialog LogDlg(CString(MAKEINTRESOURCE(IDS_LOGINFO_OPERATION_EXTRACT)));
				LogDlg.SetLogArray(LogArray);
				LogDlg.DoModal(::GetDesktopWindow());
			}
		}
		break;
	case LOGVIEW_ALWAYS:
		//ログに表示
		CLogListDialog LogDlg(CString(MAKEINTRESOURCE(IDS_LOGINFO_OPERATION_EXTRACT)));
		LogDlg.SetLogArray(LogArray);
		LogDlg.DoModal(::GetDesktopWindow());
		break;
	}

	TRACE(_T("Exit Extract()\n"));
	return bAllOK;
}