X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/77ffb5937e89927b621128789401db8921fe580f..55ca41b1ea89c0e6ccf84973091bea8b936eee06:/src/html/chm.cpp?ds=inline diff --git a/src/html/chm.cpp b/src/html/chm.cpp index f42dd16085..584f7fb2cc 100644 --- a/src/html/chm.cpp +++ b/src/html/chm.cpp @@ -1,28 +1,28 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: chm.cpp +// Name: src/html/chm.cpp // Purpose: CHM (Help) support for wxHTML // Author: Markus Sinner // Copyright: (c) 2003 Herd Software Development // CVS-ID: $Id$ -// Licence: wxWidgets Licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop #endif #if wxUSE_LIBMSPACK #include -#ifndef WXPRECOMP -#include "wx/intl.h" -#include "wx/log.h" +#ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" + #include "wx/module.h" #endif -#include "wx/module.h" #include "wx/filesys.h" #include "wx/mstream.h" #include "wx/wfstream.h" @@ -70,7 +70,7 @@ public: /// check archive for a file bool Contains(const wxString& pattern); - /// get a string for the last error occured + /// get a string for the last error which occurred const wxString GetLastErrorMessage(); /// Last Error @@ -122,7 +122,7 @@ wxChmTools::wxChmTools(const wxFileName &archive) // strdup() [libmspack-20030726], which would cause crashes in // Unicode build when mb_str() returns temporary buffer m_chmFileNameANSI = strdup((const char*)m_chmFileName.mb_str(wxConvFile)); - + // Open the archive and store it in class: if ( (chmh = chmd->open(chmd, (char*)m_chmFileNameANSI)) ) { @@ -204,7 +204,7 @@ bool wxChmTools::Contains(const wxString& pattern) * * Finds the next file descibed by a pattern in the archive, starting * the file given by second parameter - * + * * @param pattern The file-pattern to search for. May contain '*' and/or '?' * @param startfrom The filename which the search should start after * @returns The full pathname of the found file @@ -364,7 +364,7 @@ public: wxChmInputStream(const wxString& archive, const wxString& file, bool simulate = false); /// Destructor - ~wxChmInputStream(); + virtual ~wxChmInputStream(); /// Return the size of the accessed file in archive virtual size_t GetSize() const { return m_size; } @@ -377,13 +377,13 @@ protected: /// See wxInputStream virtual size_t OnSysRead(void *buffer, size_t bufsize); /// See wxInputStream - virtual off_t OnSysSeek(off_t seek, wxSeekMode mode); + virtual wxFileOffset OnSysSeek(wxFileOffset seek, wxSeekMode mode); /// See wxInputStream - virtual off_t OnSysTell() const { return m_pos; } + virtual wxFileOffset OnSysTell() const { return m_pos; } private: size_t m_size; - off_t m_pos; + wxFileOffset m_pos; bool m_simulateHHP; char * m_content; @@ -414,7 +414,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) @@ -487,21 +487,35 @@ 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; } -off_t wxChmInputStream::OnSysSeek(off_t seek, wxSeekMode mode) +wxFileOffset wxChmInputStream::OnSysSeek(wxFileOffset seek, wxSeekMode mode) { wxString mode_str = wxEmptyString; @@ -512,7 +526,7 @@ off_t wxChmInputStream::OnSysSeek(off_t seek, wxSeekMode mode) } m_lasterror = wxSTREAM_NO_ERROR; - off_t nextpos; + wxFileOffset nextpos; switch ( mode ) { @@ -541,7 +555,7 @@ off_t wxChmInputStream::OnSysSeek(off_t 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. */ @@ -561,7 +575,7 @@ wxChmInputStream::CreateHHPStream() if ( ! m_chm->Contains(_T("/#SYSTEM")) ) { #ifdef DEBUG - wxLogDebug(_("Archive doesnt contain #SYSTEM file")); + wxLogDebug("Archive doesn't contain #SYSTEM file"); #endif return; } @@ -595,7 +609,9 @@ wxChmInputStream::CreateHHPStream() { // Read #SYSTEM-Code and length i->Read(&code, 2); + code = wxUINT16_SWAP_ON_BE( code ) ; i->Read(&len, 2); + len = wxUINT16_SWAP_ON_BE( len ) ; // data buf = malloc(len); i->Read(buf, len); @@ -625,7 +641,19 @@ wxChmInputStream::CreateHHPStream() out->Write( (const void *) tmp, strlen(tmp)); tmp = NULL; break; - case 4: // STRUCT + case 4: // STRUCT SYSTEM INFO + tmp = NULL ; + if ( len >= 28 ) + { + char *structptr = (char*) buf ; + // 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() ) ; + } + break ; default: tmp=NULL; } @@ -682,7 +710,7 @@ wxChmInputStream::CreateHHPStream() bool wxChmInputStream::CreateFileStream(const wxString& pattern) { wxFileInputStream * fin; - wxString tmpfile = wxFileName::CreateTempFileName(_T("chmstrm"), NULL); + wxString tmpfile = wxFileName::CreateTempFileName(_T("chmstrm")); if ( tmpfile.empty() ) { @@ -703,6 +731,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); @@ -729,15 +760,15 @@ class wxChmFSHandler : public wxFileSystemHandler public: /// Constructor and Destructor wxChmFSHandler(); - ~wxChmFSHandler(); + virtual ~wxChmFSHandler(); /// Is able to open location? virtual bool CanOpen(const wxString& location); /// Open a file virtual wxFSFile* OpenFile(wxFileSystem& fs, const wxString& location); - /// Find first occurence of spec + /// Find first occurrence of spec virtual wxString FindFirst(const wxString& spec, int flags = 0); - /// Find next occurence of spec + /// Find next occurrence of spec virtual wxString FindNext(); private: @@ -811,13 +842,11 @@ wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), // 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, + wxEmptyString, GetAnchor(location), wxDateTime(wxFileModificationTime(left))); }