bool MANFrame::SearchManPage(const wxString &dirs, const wxString &keyword) { SetDirs(dirs); if (keyword.IsEmpty()) { if (m_dirsVect.empty()) { SetPage(NoSearchDirsSet); } return false; } std::vector<wxString> files_found; GetMatches(keyword, &files_found); m_entry->SetValue(keyword); if (files_found.empty()) { SetPage(ManPageNotFound); return false; } if (files_found.size() == 1) { wxString filename = files_found.front(); wxString man_page = GetManPage(filename); if (man_page.IsEmpty()) { SetPage(ManPageNotFound); return false; } SetPage(cbC2U(man2html_buffer(cbU2C(man_page)))); return true; } SetPage(CreateLinksPage(files_found)); return true; }
void MANFrame::OnLinkClicked(wxHtmlLinkEvent &event) { wxString link = event.GetLinkInfo().GetHref(); if (link.StartsWith(_T("man:"), &link)) { if (link.Last() == _T(')')) { link.RemoveLast(); wxString name = link.BeforeLast(_T('(')); if (name.IsEmpty()) { return; } wxString section = link.AfterLast(_T('(')); if (!section.IsEmpty()) { name += _T(".") + section; } SearchManPage(name); } } else if (link.StartsWith(_T("fman:"), &link)) { wxString man_page = GetManPage(link); if (man_page.IsEmpty()) { SetPage(ManPageNotFound); return; } SetPage(cbC2U(man2html_buffer(cbU2C(man_page)))); } else if (wxFileName(link).GetExt().Mid(0, 3).CmpNoCase(_T("htm")) == 0) { m_htmlWindow->LoadPage(link); } }
wxString MANFrame::GetManPage(wxString filename, int depth) { wxString orgFilename = filename; if (filename.IsEmpty() || !wxFileName::FileExists(filename) || depth == 2) { return wxString(); } wxString ret; if (filename.EndsWith(_T(".gz"))) { gzFile f = gzopen(filename.mb_str(), "rb"); if (!f) { return wxString(); } char buffer[4096]; int read_bytes = -1; while (true) { read_bytes = gzread(f, buffer, sizeof(buffer)); if (read_bytes <= 0) // -1 = error, 0 = eof { break; } ret += wxString(buffer, wxConvLocal, read_bytes); } gzclose(f); if (read_bytes == -1) { return wxString(); } } else { if (filename.EndsWith(_T(".bz2"))) { if (!m_tmpfile.IsEmpty()) { if (wxFileName::FileExists(m_tmpfile)) { wxRemoveFile(m_tmpfile); } } m_tmpfile = wxFileName::CreateTempFileName(_T("manbz2")); if (!Decompress(filename, m_tmpfile)) { wxRemoveFile(m_tmpfile); m_tmpfile.Clear(); return wxString(); } filename = m_tmpfile; } wxStringOutputStream sos; wxFileInputStream f(filename); if (!f.IsOk()) { return wxString(); } f.Read(sos); ret = sos.GetString(); } // Check if we should follow the link if (ret.StartsWith(_T(".so "), &ret)) { wxString path = ret.BeforeFirst(_T('\n')); wxString name; wxString ext; wxString newfilename; wxFileName::SplitPath(path, 0, &name, &ext, wxPATH_UNIX); // man pages "always" use / newfilename = name + _T(".") + ext; wxFileName::SplitPath(orgFilename, &path, 0, &ext); newfilename = path + wxFileName::GetPathSeparator() + newfilename; if (ext == _T("bz2") || ext == _T("gz")) { newfilename += _T(".") + ext; } else if (!wxFileName::FileExists(newfilename)) { if (wxFileName::FileExists(newfilename + wxT(".bz2"))) newfilename += wxT(".bz2"); else if (wxFileName::FileExists(newfilename + wxT(".gz"))) newfilename += wxT(".gz"); } return GetManPage(newfilename, depth + 1); } return ret; }