X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f35822af105b8ea388589c0433c014735c84feac..4004f41e3ce1655f9fa05c55a697ac0f8677c23a:/src/html/helpdata.cpp diff --git a/src/html/helpdata.cpp b/src/html/helpdata.cpp index 8e6b8df21c..7c3616de5f 100644 --- a/src/html/helpdata.cpp +++ b/src/html/helpdata.cpp @@ -32,6 +32,9 @@ #include "wx/tokenzr.h" #include "wx/wfstream.h" #include "wx/busyinfo.h" +#include "wx/encconv.h" +#include "wx/fontmap.h" +#include "wx/log.h" #include "wx/html/htmlpars.h" #include "wx/html/htmldefs.h" @@ -219,7 +222,7 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c HP_TagHandler *handler = new HP_TagHandler(book); parser.AddTagHandler(handler); - f = ( contentsfile.IsEmpty() ? 0 : fsys.OpenFile(contentsfile) ); + f = ( contentsfile.IsEmpty() ? NULL : fsys.OpenFile(contentsfile) ); if (f) { sz = f -> GetStream() -> GetSize(); buf = new char[sz + 1]; @@ -231,8 +234,10 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c handler -> WriteOut(m_Contents, m_ContentsCnt); delete[] buf; } + else + wxLogError(_("Cannot open contents file: %s"), contentsfile.mb_str()); - f = ( indexfile.IsEmpty() ? 0 : fsys.OpenFile(indexfile) ); + f = ( indexfile.IsEmpty() ? NULL : fsys.OpenFile(indexfile) ); if (f) { sz = f -> GetStream() -> GetSize(); buf = new char[sz + 1]; @@ -244,6 +249,8 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c handler -> WriteOut(m_Index, m_IndexCnt); delete[] buf; } + else if (!indexfile.IsEmpty()) + wxLogError(_("Cannot open index file: %s"), indexfile.mb_str()); return TRUE; } @@ -276,9 +283,13 @@ bool wxHtmlHelpData::LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f) f -> Read(&x, sizeof(x)); version = wxINT32_SWAP_ON_BE(x); - if (version != CURRENT_CACHED_BOOK_VERSION) return FALSE; + if (version != CURRENT_CACHED_BOOK_VERSION) + { + wxLogError(_("Incorrect version of HTML help book")); + return FALSE; // NOTE: when adding new version, please ensure backward compatibility! - + } + /* load contents : */ f -> Read(&x, sizeof(x)); @@ -383,7 +394,19 @@ void wxHtmlHelpData::SetTempDir(const wxString& path) } + +static wxString SafeFileName(const wxString& s) +{ + wxString res(s); + res.Replace(wxT("#"), wxT("_")); + res.Replace(wxT(":"), wxT("_")); + res.Replace(wxT("\\"), wxT("_")); + res.Replace(wxT("/"), wxT("_")); + return res; +} + bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, + wxFontEncoding encoding, const wxString& title, const wxString& contfile, const wxString& indexfile, const wxString& deftopic, const wxString& path) @@ -391,6 +414,9 @@ bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, wxFileSystem fsys; wxFSFile *fi; wxHtmlBookRecord *bookr; + + int IndexOld = m_IndexCnt, + ContentsOld = m_ContentsCnt; if (! path.IsEmpty()) fsys.ChangePathTo(path, TRUE); @@ -431,7 +457,7 @@ bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, if (m_TempPath != wxEmptyString) { wxFileOutputStream *outs = new wxFileOutputStream(m_TempPath + - wxFileNameFromPath(bookfile.GetLocation()) + wxT(".cached")); + SafeFileName(wxFileNameFromPath(bookfile.GetLocation())) + wxT(".cached")); SaveCachedBook(bookr, outs); delete outs; } @@ -442,6 +468,23 @@ bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, // Now store the contents range bookr->SetContentsRange(cont_start, m_ContentsCnt); + + // Convert encoding, if neccessary: + if (encoding != wxFONTENCODING_SYSTEM) + { + wxFontEncodingArray a = wxEncodingConverter::GetPlatformEquivalents(encoding); + if (a.GetCount() != 0 && a[0] != encoding) + { + int i; + wxEncodingConverter conv; + conv.Init(encoding, a[0]); + + for (i = IndexOld; i < m_IndexCnt; i++) + conv.Convert(m_Index[i].m_Name); + for (i = ContentsOld; i < m_ContentsCnt; i++) + conv.Convert(m_Contents[i].m_Name); + } + } m_BookRecords.Add(bookr); if (m_IndexCnt > 0) @@ -484,15 +527,21 @@ bool wxHtmlHelpData::AddBook(const wxString& book) char linebuf[300]; wxString title = _("noname"), - safetitle, - start = wxEmptyString, - contents = wxEmptyString, index = wxEmptyString; + safetitle, + start = wxEmptyString, + contents = wxEmptyString, + index = wxEmptyString, + charset = wxEmptyString; if (wxIsAbsolutePath(book)) bookFull = book; else bookFull = wxGetCwd() + "/" + book; fi = fsys.OpenFile(bookFull); - if (fi == NULL) return FALSE; + if (fi == NULL) + { + wxLogError(_("Cannot open HTML help book: %s"), bookFull.mb_str()); + return FALSE; + } fsys.ChangePathTo(bookFull); s = fi -> GetStream(); sz = s -> GetSize(); @@ -512,10 +561,16 @@ bool wxHtmlHelpData::AddBook(const wxString& book) index = linebuf + strlen("Index file="); if (strstr(linebuf, "Contents file=") == linebuf) contents = linebuf + strlen("Contents file="); + if (strstr(linebuf, "Charset=") == linebuf) + charset = linebuf + strlen("Charset="); } while (lineptr != NULL); delete[] buff; - - bool rtval = AddBookParam(*fi, title, contents, index, start, fsys.GetPath()); + + wxFontEncoding enc; + if (charset == wxEmptyString) enc = wxFONTENCODING_SYSTEM; + else enc = wxTheFontMapper -> CharsetToEncoding(charset); + bool rtval = AddBookParam(*fi, enc, + title, contents, index, start, fsys.GetPath()); delete fi; return rtval; }