]> 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 70dbf6188634277f6eed40dcbf375c1490e775bd..584f7fb2cc58b9e6e88cb2a6f027e5c63910bcbd 100644 (file)
@@ -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
  *                 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)
  */
 wxChmInputStream::wxChmInputStream(const wxString& archive,
                                    const wxString& filename, bool simulate)
@@ -487,15 +487,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
     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;
 
     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 +555,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.
 /**
  * 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.
  */
  * to rebuild the information based on stored
  * system-files.
  */
@@ -561,7 +575,7 @@ wxChmInputStream::CreateHHPStream()
     if ( ! m_chm->Contains(_T("/#SYSTEM")) )
     {
 #ifdef DEBUG
     if ( ! m_chm->Contains(_T("/#SYSTEM")) )
     {
 #ifdef DEBUG
-        wxLogDebug(_("Archive doesnt contain #SYSTEM file"));
+        wxLogDebug("Archive doesn't contain #SYSTEM file");
 #endif
         return;
     }
 #endif
         return;
     }
@@ -717,6 +731,9 @@ bool wxChmInputStream::CreateFileStream(const wxString& pattern)
     {
         // Open a filestream to extracted file
         fin = new wxFileInputStream(tmpfile);
     {
         // 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);
         m_size = fin->GetSize();
         m_content = (char *) malloc(m_size+1);
         fin->Read(m_content, m_size);
@@ -825,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);
 
     // 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,
     if ( s )
     {
         return new wxFSFile(s,
                             left + _T("#chm:") + right,
-                            mime,
+                            wxEmptyString,
                             GetAnchor(location),
                             wxDateTime(wxFileModificationTime(left)));
     }
                             GetAnchor(location),
                             wxDateTime(wxFileModificationTime(left)));
     }