]> git.saurik.com Git - wxWidgets.git/blobdiff - src/html/chm.cpp
Implement sorting in wxTreeListCtrl.
[wxWidgets.git] / src / html / chm.cpp
index 5e14bcd55da6b747dc573481611b308bcb744823..3d6ad7d60ce4a764414ed96b2f00870898bea81d 100644 (file)
@@ -103,7 +103,7 @@ wxChmTools::wxChmTools(const wxFileName &archive)
 {
     m_chmFileName = archive.GetFullPath();
 
 {
     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;
 
     m_archive = NULL;
     m_decompressor = NULL;
@@ -435,7 +435,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 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();
         {
             // now we open an hhp-file
             CreateHHPStream();
@@ -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;
 }
 
 
 }
 
 
@@ -558,7 +572,7 @@ 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
 
     // 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 doesn't contain #SYSTEM file");
     {
 #ifdef DEBUG
         wxLogDebug("Archive doesn't contain #SYSTEM file");
@@ -567,10 +581,10 @@ wxChmInputStream::CreateHHPStream()
     }
     else
     {
     }
     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
     {
         // New stream for writing a memory area to simulate the
         // .hhp-file
@@ -605,8 +619,11 @@ wxChmInputStream::CreateHHPStream()
             switch (code)
             {
                 case 0: // CONTENTS_FILE
             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=";
                     break;
                 case 1: // INDEX_FILE
                     tmp = "Index file=";
@@ -635,9 +652,10 @@ wxChmInputStream::CreateHHPStream()
                         // LCID at position 0
                         wxUint32 dummy = *((wxUint32 *)(structptr+0)) ;
                         wxUint32 lcid = wxUINT32_SWAP_ON_BE( dummy ) ;
                         // 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:
                     }
                     break ;
                 default:
@@ -662,13 +680,13 @@ wxChmInputStream::CreateHHPStream()
             free (m_content);
 
         // Now add entries which are missing
             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));
         }
 
         {
             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));
         {
             tmp = "Index File=*.hhk\r\n";
             out->Write((const void *) tmp, strlen(tmp));
@@ -696,7 +714,7 @@ wxChmInputStream::CreateHHPStream()
 bool wxChmInputStream::CreateFileStream(const wxString& pattern)
 {
     wxFileInputStream * fin;
 bool wxChmInputStream::CreateFileStream(const wxString& pattern)
 {
     wxFileInputStream * fin;
-    wxString tmpfile = wxFileName::CreateTempFileName(_T("chmstrm"));
+    wxString tmpfile = wxFileName::CreateTempFileName(wxT("chmstrm"));
 
     if ( tmpfile.empty() )
     {
 
     if ( tmpfile.empty() )
     {
@@ -781,8 +799,8 @@ wxChmFSHandler::~wxChmFSHandler()
 bool wxChmFSHandler::CanOpen(const wxString& location)
 {
     wxString p = GetProtocol(location);
 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),
 }
 
 wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs),
@@ -795,7 +813,7 @@ wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs),
 
     int index;
 
 
     int index;
 
-    if ( GetProtocol(left) != _T("file") )
+    if ( GetProtocol(left) != wxT("file") )
     {
         wxLogError(_("CHM handler currently supports only local files!"));
         return NULL;
     {
         wxLogError(_("CHM handler currently supports only local files!"));
         return NULL;
@@ -803,27 +821,29 @@ wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs),
 
     // Work around javascript
     wxString tmp = wxString(right);
 
     // 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
     }
 
     // now work on the right location
-    if (right.Contains(_T("..")))
+    if (right.Contains(wxT("..")))
     {
         wxFileName abs(right);
     {
         wxFileName abs(right);
-        abs.MakeAbsolute(_T("/"));
+        abs.MakeAbsolute(wxT("/"));
         right = abs.GetFullPath();
     }
 
     // a workaround for absolute links to root
         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);
     {
         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);
 
     // Open a stream to read the content of the chm-file
     s = new wxChmInputStream(leftFilename.GetFullPath(), right, true);
@@ -831,10 +851,10 @@ wxFSFile* wxChmFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs),
     if ( s )
     {
         return new wxFSFile(s,
     if ( s )
     {
         return new wxFSFile(s,
-                            left + _T("#chm:") + right,
+                            left + wxT("#chm:") + right,
                             wxEmptyString,
                             GetAnchor(location),
                             wxEmptyString,
                             GetAnchor(location),
-                            wxDateTime(wxFileModificationTime(left)));
+                            wxDateTime(leftFilename.GetModificationTime()));
     }
 
     delete s;
     }
 
     delete s;
@@ -852,24 +872,24 @@ wxString wxChmFSHandler::FindFirst(const wxString& spec, int flags)
     wxString left = GetLeftLocation(spec);
     wxString nativename = wxFileSystem::URLToFileName(left).GetFullPath();
 
     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));
     {
         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() &&
 
     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;
     }
 
     return m_found;