X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1a1dac18e34ef7736c1e82f3ede88338e78824b6..d223107206e4dfa6768e0bc2455325dd49e4d2bb:/src/html/helpdata.cpp diff --git a/src/html/helpdata.cpp b/src/html/helpdata.cpp index 25ea6a6164..c0418b8d39 100644 --- a/src/html/helpdata.cpp +++ b/src/html/helpdata.cpp @@ -9,8 +9,8 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) +#pragma implementation "helpdata.h" #endif // For compilers that support precompilation, includes "wx.h". @@ -29,6 +29,8 @@ #include "wx/log.h" #endif +#include + #include "wx/html/helpdata.h" #include "wx/tokenzr.h" #include "wx/wfstream.h" @@ -38,6 +40,7 @@ #include "wx/log.h" #include "wx/html/htmlpars.h" #include "wx/html/htmldefs.h" +#include "wx/html/htmlfilt.h" #include "wx/filename.h" #include "wx/arrimpl.cpp" @@ -82,9 +85,14 @@ wxHtmlHelpIndexCompareFunc(const void *a, const void *b) class HP_Parser : public wxHtmlParser { public: + HP_Parser() { } + wxObject* GetProduct() { return NULL; } + protected: virtual void AddText(const wxChar* WXUNUSED(txt)) {} + + DECLARE_NO_COPY_CLASS(HP_Parser) }; @@ -111,6 +119,8 @@ class HP_TagHandler : public wxHtmlTagHandler bool HandleTag(const wxHtmlTag& tag); void WriteOut(wxHtmlContentsItem*& array, int& size); void ReadIn(wxHtmlContentsItem* array, int size); + + DECLARE_NO_COPY_CLASS(HP_TagHandler) }; @@ -248,12 +258,10 @@ wxHtmlHelpData::~wxHtmlHelpData() } } -// defined in htmlfilt.cpp -void wxPrivate_ReadString(wxString& str, wxInputStream* s); - bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, const wxString& indexfile, const wxString& contentsfile) { wxFSFile *f; + wxHtmlFilterHTML filter; wxString buf; wxString string; @@ -265,27 +273,31 @@ bool wxHtmlHelpData::LoadMSProject(wxHtmlBookRecord *book, wxFileSystem& fsys, c if (f) { buf.clear(); - wxPrivate_ReadString(buf, f->GetStream()); + buf = filter.ReadFile(*f); delete f; handler->ReadIn(m_Contents, m_ContentsCnt); parser.Parse(buf); handler->WriteOut(m_Contents, m_ContentsCnt); } else + { wxLogError(_("Cannot open contents file: %s"), contentsfile.c_str()); + } f = ( indexfile.IsEmpty() ? (wxFSFile*) NULL : fsys.OpenFile(indexfile) ); if (f) { buf.clear(); - wxPrivate_ReadString(buf, f->GetStream()); + buf = filter.ReadFile(*f); delete f; handler->ReadIn(m_Index, m_IndexCnt); parser.Parse(buf); handler->WriteOut(m_Index, m_IndexCnt); } else if (!indexfile.IsEmpty()) + { wxLogError(_("Cannot open index file: %s"), indexfile.c_str()); + } return TRUE; } @@ -305,22 +317,39 @@ inline static wxInt32 CacheReadInt32(wxInputStream *f) } inline static void CacheWriteString(wxOutputStream *f, const wxChar *str) -{ - size_t len = wxStrlen(str)+1; +{ +#if wxUSE_UNICODE + wxWX2MBbuf mbstr(wxConvUTF8.cWX2MB(str)); +#else + const wxChar *mbstr = str; +#endif + size_t len = strlen(mbstr)+1; CacheWriteInt32(f, len); - f->Write(str, len * sizeof(wxChar)); + f->Write(mbstr, len); } -inline static wxChar *CacheReadString(wxInputStream *f) +inline static wxChar* CacheReadString(wxInputStream *f) { - wxChar *str; + char *str; size_t len = (size_t)CacheReadInt32(f); - str = new wxChar[len]; - f->Read(str, len * sizeof(wxChar)); + str = new char[len]; + f->Read(str, len); +#if !wxUSE_UNICODE return str; +#else + wxMB2WXbuf wxstr(wxConvUTF8.cMB2WX(str)); + wxChar *outstr = new wxChar[wxStrlen(wxstr)+1]; + wxStrcpy(outstr, wxstr); + return outstr; +#endif } -#define CURRENT_CACHED_BOOK_VERSION 2 +#define CURRENT_CACHED_BOOK_VERSION 4 + +// Additional flags to detect incompatibilities of the runtime environment: +#define CACHED_BOOK_FORMAT_FLAGS \ + (wxUSE_UNICODE << 0) + bool wxHtmlHelpData::LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f) { @@ -329,7 +358,7 @@ bool wxHtmlHelpData::LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f) /* load header - version info : */ version = CacheReadInt32(f); - + if (version != CURRENT_CACHED_BOOK_VERSION) { // NB: We can just silently return FALSE here and don't worry about @@ -339,6 +368,9 @@ bool wxHtmlHelpData::LoadCachedBook(wxHtmlBookRecord *book, wxInputStream *f) return FALSE; } + if (CacheReadInt32(f) != CACHED_BOOK_FORMAT_FLAGS) + return FALSE; + /* load contents : */ st = m_ContentsCnt; m_ContentsCnt += CacheReadInt32(f); @@ -376,6 +408,7 @@ bool wxHtmlHelpData::SaveCachedBook(wxHtmlBookRecord *book, wxOutputStream *f) /* save header - version info : */ CacheWriteInt32(f, CURRENT_CACHED_BOOK_VERSION); + CacheWriteInt32(f, CACHED_BOOK_FORMAT_FLAGS); /* save contents : */ for (cnt = 0, i = 0; i < m_ContentsCnt; i++) @@ -481,13 +514,17 @@ bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, fi = fsys.OpenFile(bookfile.GetLocation() + wxT(".cached")); if (fi == NULL || +#if wxUSE_DATETIME fi->GetModificationTime() < bookfile.GetModificationTime() || +#endif // wxUSE_DATETIME !LoadCachedBook(bookr, fi->GetStream())) { if (fi != NULL) delete fi; fi = fsys.OpenFile(m_TempPath + wxFileNameFromPath(bookfile.GetLocation()) + wxT(".cached")); if (m_TempPath == wxEmptyString || fi == NULL || +#if wxUSE_DATETIME fi->GetModificationTime() < bookfile.GetModificationTime() || +#endif // wxUSE_DATETIME !LoadCachedBook(bookr, fi->GetStream())) { LoadMSProject(bookr, fsys, indexfile, contfile); @@ -533,14 +570,24 @@ bool wxHtmlHelpData::AddBookParam(const wxFSFile& bookfile, bool wxHtmlHelpData::AddBook(const wxString& book) { - if (book.Right(4).Lower() == wxT(".zip") || - book.Right(4).Lower() == wxT(".htb") /*html book*/) + wxString extension(book.Right(4).Lower()); + if (extension == wxT(".zip") || +#if wxUSE_LIBMSPACK + extension == wxT(".chm") /*compressed html help book*/ || +#endif + extension == wxT(".htb") /*html book*/) { wxFileSystem fsys; wxString s; bool rt = FALSE; - s = fsys.FindFirst(book + wxT("#zip:") + wxT("*.hhp"), wxFILE); +#if wxUSE_LIBMSPACK + if (extension == wxT(".chm")) + s = fsys.FindFirst(book + wxT("#chm:*.hhp"), wxFILE); + else +#endif + s = fsys.FindFirst(book + wxT("#zip:*.hhp"), wxFILE); + while (!s.IsEmpty()) { if (AddBook(s)) rt = TRUE; @@ -549,73 +596,58 @@ bool wxHtmlHelpData::AddBook(const wxString& book) return rt; } - else - { - wxFSFile *fi; - wxFileSystem fsys; - wxInputStream *s; - wxString bookFull; - - wxString title = _("noname"), - safetitle, - start = wxEmptyString, - contents = wxEmptyString, - index = wxEmptyString, - charset = wxEmptyString; - -#if defined(__WXMAC__) && !defined(__DARWIN__) - if (wxIsAbsolutePath(book)) bookFull = book; - else bookFull = wxGetCwd() + book; // no slash or dot - wxFileName fn( bookFull ); - bookFull = fn.GetFullPath( wxPATH_UNIX ); -#else - if (wxIsAbsolutePath(book)) bookFull = book; - else bookFull = wxGetCwd() + "/" + book; -#endif - - fi = fsys.OpenFile(bookFull); - if (fi == NULL) - { - wxLogError(_("Cannot open HTML help book: %s"), bookFull.c_str()); - return FALSE; - } - fsys.ChangePathTo(bookFull); - s = fi->GetStream(); - const wxChar *lineptr; - wxChar linebuf[300]; - wxString tmp; + wxFSFile *fi; + wxFileSystem fsys; - wxPrivate_ReadString(tmp, s); - lineptr = tmp.c_str(); + wxString title = _("noname"), + safetitle, + start = wxEmptyString, + contents = wxEmptyString, + index = wxEmptyString, + charset = wxEmptyString; - do - { - lineptr = ReadLine(lineptr, linebuf, 300); - - for (wxChar *ch = linebuf; *ch != '\0' && *ch != '='; ch++) - *ch = tolower(*ch); - - if (wxStrstr(linebuf, _T("title=")) == linebuf) - title = linebuf + wxStrlen(_T("title=")); - if (wxStrstr(linebuf, _T("default topic=")) == linebuf) - start = linebuf + wxStrlen(_T("default topic=")); - if (wxStrstr(linebuf, _T("index file=")) == linebuf) - index = linebuf + wxStrlen(_T("index file=")); - if (wxStrstr(linebuf, _T("contents file=")) == linebuf) - contents = linebuf + wxStrlen(_T("contents file=")); - if (wxStrstr(linebuf, _T("charset=")) == linebuf) - charset = linebuf + wxStrlen(_T("charset=")); - } while (lineptr != NULL); - - wxFontEncoding enc; - if (charset == wxEmptyString) enc = wxFONTENCODING_SYSTEM; - else enc = wxFontMapper::Get()->CharsetToEncoding(charset); - bool rtval = AddBookParam(*fi, enc, - title, contents, index, start, fsys.GetPath()); - delete fi; - return rtval; + fi = fsys.OpenFile(book); + if (fi == NULL) + { + wxLogError(_("Cannot open HTML help book: %s"), book.c_str()); + return FALSE; } + fsys.ChangePathTo(book); + + const wxChar *lineptr; + wxChar linebuf[300]; + wxString tmp; + wxHtmlFilterPlainText filter; + tmp = filter.ReadFile(*fi); + lineptr = tmp.c_str(); + + do + { + lineptr = ReadLine(lineptr, linebuf, 300); + + for (wxChar *ch = linebuf; *ch != wxT('\0') && *ch != wxT('='); ch++) + *ch = tolower(*ch); + + if (wxStrstr(linebuf, _T("title=")) == linebuf) + title = linebuf + wxStrlen(_T("title=")); + if (wxStrstr(linebuf, _T("default topic=")) == linebuf) + start = linebuf + wxStrlen(_T("default topic=")); + if (wxStrstr(linebuf, _T("index file=")) == linebuf) + index = linebuf + wxStrlen(_T("index file=")); + if (wxStrstr(linebuf, _T("contents file=")) == linebuf) + contents = linebuf + wxStrlen(_T("contents file=")); + if (wxStrstr(linebuf, _T("charset=")) == linebuf) + charset = linebuf + wxStrlen(_T("charset=")); + } while (lineptr != NULL); + + wxFontEncoding enc; + if (charset == wxEmptyString) enc = wxFONTENCODING_SYSTEM; + else enc = wxFontMapper::Get()->CharsetToEncoding(charset); + bool rtval = AddBookParam(*fi, enc, + title, contents, index, start, fsys.GetPath()); + delete fi; + return rtval; } wxString wxHtmlHelpData::FindPageByName(const wxString& x) @@ -771,7 +803,7 @@ bool wxHtmlSearchStatus::Search() file = fsys.OpenFile(m_Data->m_Contents[i].m_Book->GetFullPath(thepage)); if (file) { - if (m_Engine.Scan(file->GetStream())) + if (m_Engine.Scan(*file)) { m_Name = m_Data->m_Contents[i].m_Name; m_ContentsItem = m_Data->m_Contents + i; @@ -790,10 +822,10 @@ bool wxHtmlSearchStatus::Search() //-------------------------------------------------------------------------------- -// wxSearchEngine +// wxHtmlSearchEngine //-------------------------------------------------------------------------------- -void wxSearchEngine::LookFor(const wxString& keyword, bool case_sensitive, bool whole_words_only) +void wxHtmlSearchEngine::LookFor(const wxString& keyword, bool case_sensitive, bool whole_words_only) { m_CaseSensitive = case_sensitive; m_WholeWords = whole_words_only; @@ -817,15 +849,15 @@ static inline bool WHITESPACE(wxChar c) return c == _T(' ') || c == _T('\n') || c == _T('\r') || c == _T('\t'); } -bool wxSearchEngine::Scan(wxInputStream *stream) +bool wxHtmlSearchEngine::Scan(const wxFSFile& file) { - wxASSERT_MSG(m_Keyword != NULL, wxT("wxSearchEngine::LookFor must be called before scanning!")); + wxASSERT_MSG(m_Keyword != NULL, wxT("wxHtmlSearchEngine::LookFor must be called before scanning!")); int i, j; int wrd = wxStrlen(m_Keyword); bool found = FALSE; - wxString tmp; - wxPrivate_ReadString(tmp, stream); + wxHtmlFilterHTML filter; + wxString tmp = filter.ReadFile(file); int lng = tmp.length(); const wxChar *buf = tmp.c_str();