X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1aedb1dd8b6e2ace57901cbe0ce70786ddb67947..789f8e6ad40488d2dd5f5f4d87e195d0f1e23422:/src/html/helpdata.cpp diff --git a/src/html/helpdata.cpp b/src/html/helpdata.cpp index e8b0e27bab..ab8e0036fa 100644 --- a/src/html/helpdata.cpp +++ b/src/html/helpdata.cpp @@ -9,7 +9,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "helpdata.h" #endif @@ -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); @@ -553,8 +590,6 @@ bool wxHtmlHelpData::AddBook(const wxString& book) { wxFSFile *fi; wxFileSystem fsys; - wxInputStream *s; - wxString bookFull; wxString title = _("noname"), safetitle, @@ -563,37 +598,26 @@ bool wxHtmlHelpData::AddBook(const wxString& book) 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); + fi = fsys.OpenFile(book); if (fi == NULL) { - wxLogError(_("Cannot open HTML help book: %s"), bookFull.c_str()); + wxLogError(_("Cannot open HTML help book: %s"), book.c_str()); return FALSE; } - fsys.ChangePathTo(bookFull); - s = fi->GetStream(); + fsys.ChangePathTo(book); const wxChar *lineptr; wxChar linebuf[300]; wxString tmp; - - wxPrivate_ReadString(tmp, s); + wxHtmlFilterPlainText filter; + tmp = filter.ReadFile(*fi); lineptr = tmp.c_str(); do { lineptr = ReadLine(lineptr, linebuf, 300); - for (wxChar *ch = linebuf; *ch != '\0' && *ch != '='; ch++) + for (wxChar *ch = linebuf; *ch != wxT('\0') && *ch != wxT('='); ch++) *ch = tolower(*ch); if (wxStrstr(linebuf, _T("title=")) == linebuf) @@ -771,7 +795,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 +814,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 +841,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();