Exemple #1
0
bool Ghostscript::Install(HWND hwnd,MSGFUNC &msgfunc){
	m_installresult = false;
	if(!m_doinst)return true;
	if(!m_downloadresult)return false;
	ablib::string file = g_Setting.GetDownloadDir() + m_file.file;
	boost::filesystem::path path(file);
	CProgressBarCtrl progress_bar(::GetDlgItem(hwnd,IDC_PROGRESS));
	static const int PROGRESSBAR_MAX = 32768;

	if(file.length() < 4 || file.substr(file.length() - 4) != _T(".exe")){
		::MessageBox(hwnd,_TR("古い Ghostscript を発見しました.このバージョンには対応していません."),_T("abtlinst"),0);
		return false;
	}
	ablib::system::Process process;
	ablib::system::Process::ProcessStartInfo s;

	ablib::string gsdir;
	gsdir = g_Setting.GetInstallDir() + _T("gs");
	if(m_version != 0){
		ablib::string ver = boost::lexical_cast<ablib::string>(m_version);

		// 後ろから二つおきにピリオドを挿入
		ablib::string::size_type start = (ver.length() % 2);
		int len = ver.length();
		for(ablib::string::size_type i = 0 ; i < len/2 ; ++i){
			ver.insert(start + 3*i,_T("."));
		}
		gsdir += _T("\\gs") + ver;
	}
	
	s.Arguments = _T("\"") + file + _T("\" /S /D=") + gsdir;
//	s.Arguments = _T("\"") + file + _T("\" /D=") + g_Setting.GetInstallDir() + _T("gs");
//	s.Arg = _T("\"") + file + _T("\"");
	s.FileName = _T("");
	s.WorkingDirectory = path.parent_path().wstring();
	s.RedirectStandardError = false;
	s.RedirectStandardOutput = false;
	s.RedirectStandardInput = false;
	s.ShowState = ablib::system::Process::ProcessStartInfo::show;
	s.CreateNoWindow = false;
	process.StartInfo(s);
	CheckandSetTmp(g_Setting.GetTmpDir().c_str());
	msgfunc.msg(_T("Ghostscript のインストール\n"));
	msgfunc.detail(_T("Ghostscript をインストール中\n"));
	if(!process.Start()){
		g_Setting.Log(file + _T(" の起動に失敗"));
		return false;
	}else{
		process.WaitForExit();
	}
	
	progress_bar.SetPos(PROGRESSBAR_MAX/2);
	gsdir += _T("\\");

//	ablib::string gsdir = GetGSDir();
	if(g_Setting.SetPath()){
		if(gsdir != _T("")){
			g_Path.AddPath(gsdir + _T("bin"));
			g_Path.AddPath(gsdir + _T("lib"));
		}else g_Setting.Log(_TR("Ghostscript のインストールパス取得に失敗したので,PATH の設定を行いません"));
	}

	msgfunc.detail(_T("cidfmap の生成\n"));
	LPITEMIDLIST id;
	LPMALLOC mal;
	TCHAR fontdir[4096];
	if(
		FAILED(::SHGetMalloc(&mal)) ||
		FAILED(::SHGetSpecialFolderLocation(NULL,CSIDL_FONTS,&id)) ||
		!::SHGetPathFromIDList(id,fontdir)
	){
		g_Setting.Log(_T("cidfmap の生成に失敗(フォントフォルダの取得に失敗)."));
		return false;
	}
		
	mal->Free(id);
	if(fontdir[::lstrlen(fontdir) - 1] != '\\')::lstrcat(fontdir,_T("\\"));
	
	ablib::string arg = ablib::string(_T("-q -dBATCH -sFONTDIR=")) + fontdir + _T(" -sCIDFMAP=") + gsdir + _T("lib\\cidfmap") + _T(" ") + gsdir + _T("lib\\mkcidfm.ps");
	arg.replace(_T("\\"),_T("/"));
	s.Arguments = _T("\"") + gsdir + _T("\\bin\\gswin32c.exe\" ") + arg;
	s.WorkingDirectory = gsdir + _T("\\bin");
	process.StartInfo(s);
	if(!process.Start()){
		g_Setting.Log(s.Arguments + _T(" の実行に失敗"));
		return false;
	}else{
		process.WaitForExit();
	}
	progress_bar.SetPos(PROGRESSBAR_MAX);
	
	m_installresult = true;
	return true;
}