X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/9920ad328b7bb97ad927b9524cbe6e1b785be742..3a4cf8a84d9a41c63125c1c1cdd6d0fbb98f41f0:/src/html/chm.cpp diff --git a/src/html/chm.cpp b/src/html/chm.cpp index f89fbe535e..cf3e04925e 100644 --- a/src/html/chm.cpp +++ b/src/html/chm.cpp @@ -3,7 +3,6 @@ // Purpose: CHM (Help) support for wxHTML // Author: Markus Sinner // Copyright: (c) 2003 Herd Software Development -// CVS-ID: $Id$ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// @@ -17,7 +16,7 @@ #include -#ifndef WXPRECOMP +#ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" #include "wx/module.h" @@ -103,7 +102,7 @@ wxChmTools::wxChmTools(const wxFileName &archive) { m_chmFileName = archive.GetFullPath(); - wxASSERT_MSG( !m_chmFileName.empty(), _T("empty archive name") ); + wxASSERT_MSG( !m_chmFileName.empty(), wxT("empty archive name") ); m_archive = NULL; m_decompressor = NULL; @@ -414,7 +413,7 @@ private: * be local file accesible via fopen, fread functions! * @param filename The Name of the file to be extracted from archive * @param simulate if true than class should simulate .HHP-File based on #SYSTEM - * if false than class does nothing if it doesnt find .hhp + * if false than class does nothing if it doesn't find .hhp */ wxChmInputStream::wxChmInputStream(const wxString& archive, const wxString& filename, bool simulate) @@ -435,7 +434,7 @@ wxChmInputStream::wxChmInputStream(const wxString& archive, // if the file could not be located, but was *.hhp, than we create // the content of the hhp-file on the fly and store it for reading // by the application - if ( m_fileName.Find(_T(".hhp")) != wxNOT_FOUND && m_simulateHHP ) + if ( m_fileName.Find(wxT(".hhp")) != wxNOT_FOUND && m_simulateHHP ) { // now we open an hhp-file CreateHHPStream(); @@ -487,15 +486,29 @@ size_t wxChmInputStream::OnSysRead(void *buffer, size_t bufsize) m_lasterror = wxSTREAM_NO_ERROR; // If the rest to read from the stream is less - // than the buffer size, than only read the rest + // than the buffer size, then only read the rest if ( m_pos + bufsize > m_size ) bufsize = m_size - m_pos; - m_contentStream->SeekI(m_pos); - m_contentStream->Read(buffer, bufsize); - m_pos +=bufsize; - m_contentStream->SeekI(m_pos); - return bufsize; + if (m_contentStream->SeekI(m_pos) == wxInvalidOffset) + { + m_lasterror = wxSTREAM_EOF; + return 0; + } + + size_t read = m_contentStream->Read(buffer, bufsize).LastRead(); + m_pos += read; + + if (m_contentStream->SeekI(m_pos) == wxInvalidOffset) + { + m_lasterror = wxSTREAM_READ_ERROR; + return 0; + } + + if (read != bufsize) + m_lasterror = m_contentStream->GetLastError(); + + return read; } @@ -541,7 +554,7 @@ wxFileOffset wxChmInputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) /** * Help Browser tries to read the contents of the * file by interpreting a .hhp file in the Archiv. - * For .chm doesnt include such a file, we need + * For .chm doesn't include such a file, we need * to rebuild the information based on stored * system-files. */ @@ -549,7 +562,6 @@ void wxChmInputStream::CreateHHPStream() { wxFileName file; - bool topic = false; bool hhc = false; bool hhk = false; wxInputStream *i; @@ -558,19 +570,19 @@ wxChmInputStream::CreateHHPStream() // Try to open the #SYSTEM-File and create the HHP File out of it // see http://bonedaddy.net/pabs3/chmspec/0.1.2/Internal.html#SYSTEM - if ( ! m_chm->Contains(_T("/#SYSTEM")) ) + if ( ! m_chm->Contains(wxT("/#SYSTEM")) ) { #ifdef DEBUG - wxLogDebug(_("Archive doesnt contain #SYSTEM file")); + wxLogDebug("Archive doesn't contain #SYSTEM file"); #endif return; } else { - file = wxFileName(_T("/#SYSTEM")); + file = wxFileName(wxT("/#SYSTEM")); } - if ( CreateFileStream(_T("/#SYSTEM")) ) + if ( CreateFileStream(wxT("/#SYSTEM")) ) { // New stream for writing a memory area to simulate the // .hhp-file @@ -605,8 +617,11 @@ wxChmInputStream::CreateHHPStream() switch (code) { case 0: // CONTENTS_FILE - tmp = "Contents file="; - hhc=true; + if (len) + { + tmp = "Contents file="; + hhc=true; + } break; case 1: // INDEX_FILE tmp = "Index file="; @@ -614,7 +629,6 @@ wxChmInputStream::CreateHHPStream() break; case 2: // DEFAULT_TOPIC tmp = "Default Topic="; - topic = true; break; case 3: // TITLE tmp = "Title="; @@ -635,9 +649,10 @@ wxChmInputStream::CreateHHPStream() // LCID at position 0 wxUint32 dummy = *((wxUint32 *)(structptr+0)) ; wxUint32 lcid = wxUINT32_SWAP_ON_BE( dummy ) ; - wxString msg ; - msg.Printf(_T("Language=0x%X\r\n"),lcid) ; - out->Write(msg.c_str() , msg.length() ) ; + char msg[64]; + int len = sprintf(msg, "Language=0x%X\r\n", lcid) ; + if (len > 0) + out->Write(msg, len) ; } break ; default: @@ -662,13 +677,13 @@ wxChmInputStream::CreateHHPStream() free (m_content); // Now add entries which are missing - if ( !hhc && m_chm->Contains(_T("*.hhc")) ) + if ( !hhc && m_chm->Contains(wxT("*.hhc")) ) { tmp = "Contents File=*.hhc\r\n"; out->Write((const void *) tmp, strlen(tmp)); } - if ( !hhk && m_chm->Contains(_T("*.hhk")) ) + if ( !hhk && m_chm->Contains(wxT("*.hhk")) ) { tmp = "Index File=*.hhk\r\n"; out->Write((const void *) tmp, strlen(tmp)); @@ -696,7 +711,7 @@ wxChmInputStream::CreateHHPStream() bool wxChmInputStream::CreateFileStream(const wxString& pattern) { wxFileInputStream * fin; - wxString tmpfile = wxFileName::CreateTempFileName(_T("chmstrm")); + wxString tmpfile = wxFileName::CreateTempFileName(wxT("chmstrm")); if ( tmpfile.empty() ) { @@ -717,6 +732,9 @@ bool wxChmInputStream::CreateFileStream(const wxString& pattern) { // Open a filestream to extracted file fin = new wxFileInputStream(tmpfile); + if (!fin->IsOk()) + return false; + m_size = fin->GetSize(); m_content = (char *) malloc(m_size+1); fin->Read(m_content, m_size); @@ -778,8 +796,8 @@ wxChmFSHandler::~wxChmFSHandler() bool wxChmFSHandler::CanOpen(const wxString& location) { wxString p = GetProtocol(location); - return (p == _T("chm")) && - (GetProtocol(GetLeftLocation(location)) == _T("file")); + return (p == wxT("chm")) && + (GetProtocol(GetLeftLocation(location)) == wxT("file")); } wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), @@ -792,7 +810,7 @@ wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), int index; - if ( GetProtocol(left) != _T("file") ) + if ( GetProtocol(left) != wxT("file") ) { wxLogError(_("CHM handler currently supports only local files!")); return NULL; @@ -800,40 +818,40 @@ wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), // Work around javascript wxString tmp = wxString(right); - if ( tmp.MakeLower().Contains(_T("javascipt")) && tmp.Contains(_T("\'")) ) + if ( tmp.MakeLower().Contains(wxT("javascipt")) && tmp.Contains(wxT("\'")) ) { - right = right.AfterFirst(_T('\'')).BeforeLast(_T('\'')); + right = right.AfterFirst(wxT('\'')).BeforeLast(wxT('\'')); } // now work on the right location - if (right.Contains(_T(".."))) + if (right.Contains(wxT(".."))) { wxFileName abs(right); - abs.MakeAbsolute(_T("/")); + abs.MakeAbsolute(wxT("/")); right = abs.GetFullPath(); } // a workaround for absolute links to root - if ( (index=right.Index(_T("//"))) != wxNOT_FOUND ) + if ( (index=right.Index(wxT("//"))) != wxNOT_FOUND ) { right=wxString(right.Mid(index+1)); wxLogWarning(_("Link contained '//', converted to absolute link.")); } wxFileName leftFilename = wxFileSystem::URLToFileName(left); + if (!leftFilename.FileExists()) + return NULL; // Open a stream to read the content of the chm-file s = new wxChmInputStream(leftFilename.GetFullPath(), right, true); - wxString mime = GetMimeTypeFromExt(location); - if ( s ) { return new wxFSFile(s, - left + _T("#chm:") + right, - mime, + left + wxT("#chm:") + right, + wxEmptyString, GetAnchor(location), - wxDateTime(wxFileModificationTime(left))); + wxDateTime(leftFilename.GetModificationTime())); } delete s; @@ -851,24 +869,24 @@ wxString wxChmFSHandler::FindFirst(const wxString& spec, int flags) wxString left = GetLeftLocation(spec); wxString nativename = wxFileSystem::URLToFileName(left).GetFullPath(); - if ( GetProtocol(left) != _T("file") ) + if ( GetProtocol(left) != wxT("file") ) { wxLogError(_("CHM handler currently supports only local files!")); return wxEmptyString; } m_chm = new wxChmTools(wxFileName(nativename)); - m_pattern = right.AfterLast(_T('/')); + m_pattern = right.AfterLast(wxT('/')); wxString m_found = m_chm->Find(m_pattern); // now fake around hhp-files which are not existing in projects... if (m_found.empty() && - m_pattern.Contains(_T(".hhp")) && - !m_pattern.Contains(_T(".hhp.cached"))) + m_pattern.Contains(wxT(".hhp")) && + !m_pattern.Contains(wxT(".hhp.cached"))) { - m_found.Printf(_T("%s#chm:%s.hhp"), - left.c_str(), m_pattern.BeforeLast(_T('.')).c_str()); + m_found.Printf(wxT("%s#chm:%s.hhp"), + left.c_str(), m_pattern.BeforeLast(wxT('.')).c_str()); } return m_found;