]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/chm.cpp
Store pointer to owning wxWindow in wxPizza widget
[wxWidgets.git] / src / html / chm.cpp
index bdba0005b25d616f307bc889e76996991c982eb4..584f7fb2cc58b9e6e88cb2a6f027e5c63910bcbd 100644 (file)
@@ -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:     wxWindows Licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
+    #pragma hdrstop
 #endif
 
 #if wxUSE_LIBMSPACK
 
 #include <mspack.h>
 
-#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.
  */
@@ -557,11 +571,11 @@ wxChmInputStream::CreateHHPStream()
     const char *tmp;
 
     // Try to open the #SYSTEM-File and create the HHP File out of it
-    // see http://bonedaddy.net/pabs3/chmspec/0.1/ch05s03.html#SYSTEM
-    if ( ! m_chm->Contains(_("/#SYSTEM")) )
+    // see http://bonedaddy.net/pabs3/chmspec/0.1.2/Internal.html#SYSTEM
+    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)));
     }