Esempio n. 1
0
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;
}
Esempio n. 2
0
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);
    }
}
Esempio n. 3
0
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;
}