bool TeX2img::Download(HWND hwnd,MSGFUNC &msgfunc){ msgfunc.msg(_T("TeX2img のファイルを探索\n")); std::wregex reg; try{reg.assign(m_filereg,std::regex_constants::icase);} catch(...){ msgfunc.detail(_T("TeX2img の発見に失敗\n")); g_Setting.Log(_T("TeX2img を発見する正規表現が不正です.")); return false; } boost::filesystem::directory_iterator end; try{ for(boost::filesystem::directory_iterator ite(m_filedir) ; ite != end ; ++ite){ boost::filesystem::path p(*ite); if(std::regex_match(p.filename().wstring(),reg)){ m_file = p.filename().wstring(); break; } } } catch(...){ g_Setting.Log(_T("TeX2img を保存しているフォルダが見つかりませんでした.")); return false; } if(m_file == _T("")){ msgfunc.detail(_T("TeX2img の発見に失敗\n")); g_Setting.Log(_T("TeX2img が見つかりませんでした.")); return false; }else return true; }
bool TeX2img::Install(HWND hwnd, MSGFUNC &msgfunc) { if(!m_doinst) { g_Setting.Log(_T("TeX2img をインストールしません.")); return true; } else g_Setting.Log(_T("TeX2img のインストールを実行.")); ablib::string dir = g_Applications.m_TeXLive.GetVar(_T("TEXDIR")); if(dir == _T("")) { g_Setting.Log(_T("TeX2img のインストール中:TEXDIR の取得に失敗しました.")); return false; } if(dir != _T("") && dir[dir.length() - 1] != '\\')dir += _T("\\"); dir += _T("bin\\win32\\"); ::CreateDirectoryReflex(dir.c_str()); msgfunc.msg(_T("TeX2img のインストール\n")); std::vector<ablib::string> dependsFiles; dependsFiles.push_back(_T("TeX2imgc.exe")); dependsFiles.push_back(_T("TeX2imgc.exe.config")); dependsFiles.push_back(_T("Azuki.dll")); dependsFiles.push_back(_T("mudraw.exe")); dependsFiles.push_back(_T("pdfiumdraw.exe")); if ( !::CopyFile((m_filedir + m_file).c_str(), (dir + _T("TeX2img.exe")).c_str(), FALSE) || !::CopyFile((m_filedir + m_file + _T(".config")).c_str(), (dir + _T("TeX2img.exe.config")).c_str(), FALSE) ){ g_Setting.Log(_T("TeX2imgのインストール:ファイルのコピーに失敗.")); } for(auto file : dependsFiles) { if(!::CopyFile((m_filedir + file).c_str(), (dir + file).c_str(), FALSE)) { g_Setting.Log(_T("TeX2imgのインストール:") + file + _T("のコピーに失敗.")); } } msgfunc.detail(_T("TeX2img をインストールしました.\n")); return TeX2img_funcs::Set( g_Applications.m_TeXLive.GetVar(_T("TEXDIR")) + _T("\\"), msgfunc.msg,msgfunc.detail, std::bind(&Setting::Log,&g_Setting,std::placeholders::_1)); }
bool Ghostscript::Download(HWND hwnd,MSGFUNC &msgfunc){ m_abort = false; m_downloadresult = false; msgfunc.msg(_T("Ghostscriptのインストールの準備中……\n")); std::vector<Network::FileData> fds; #ifndef INSTALL_FROM_LOCAL if(!m_doinst)return true; if(!g_Network.GetFileData(fds,m_url,msgfunc))return false; #else ablib::system::FindFile ff; ff.Begin(g_Setting.GetDownloadDir() + _T("*.*")); WIN32_FIND_DATA wfd; while(ff.Next(&wfd)){ Network::FileData fd; fd.file = wfd.cFileName; fd.time = ablib::system::Time(wfd.ftLastWriteTime); fd.size = wfd.nFileSizeLow; fds.push_back(fd); } #endif std::wregex reg(g_Setting.ReadSysINI(_T("GS"),_T("Reg"))); std::vector<Network::FileData> gsfds; for(auto &i : fds){ // ::OutputDebugString((i.file + _T("\n")).c_str()); if(std::regex_match(i.file,reg))gsfds.push_back(i); } if(gsfds.empty()){ msgfunc.detail(_T("Ghostscript のインストーラが見つかりませんでした.\n")); g_Setting.Log(_T("Ghostscript のインストーラがみつかりませんでした.")); return false; } reg.assign(_T("[0-9]+")); std::wsmatch reg_results; std::vector<unsigned int> version; for(auto &i : gsfds){ if(std::regex_search(i.file,reg_results,reg))version.push_back(boost::lexical_cast<int>(reg_results.str())); else version.push_back(0); } std::vector<unsigned int>::iterator max = std::max_element(version.begin(),version.end()); if(max == version.end()){ m_file = gsfds[0]; if(!version.empty())m_version = version[0]; else m_version = 0; }else{ m_file = gsfds[max - version.begin()]; m_version = *max; } #ifndef INSTALL_FROM_LOCAL ablib::system::Time local = ablib::system::File::GetLastWriteTime(g_Setting.GetDownloadDir() + m_file.file); if(local + ablib::system::Time(0,0,1) > m_file.time){ msgfunc.detail(_T("ローカルの Ghostscript のインストーラが最新のようです.ダウンロードしません.\n")); }else{ DownloadFileData dfd; dfd.url = m_url + _T("/") + m_file.file; dfd.size = m_file.size; dfd.localdir = g_Setting.GetDownloadDir(); std::vector<DownloadFileData> dfds; dfds.push_back(dfd); ::CreateDirectoryReflex(g_Setting.GetDownloadDir().c_str()); if(m_download.Download(dfds,msgfunc) != DownloadDlg::success){ msgfunc.detail(_T("Ghostscript のインストーラのダウンロードに失敗\n")); return false; } } #endif // INSTALL_FROM_LOCAL m_downloadresult = true; return true; }
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; }