]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/fileback.cpp
Fix wxHtmlHelpData::SetTempDir() to behave correctly without trailing slash.
[wxWidgets.git] / src / common / fileback.cpp
index 3ca47715627a04421daeded0c8a76beb69e1c6b8..c9c6c49476bda3d356a61d9d36455b23e17eb83a 100644 (file)
@@ -2,7 +2,6 @@
 // Name:        src/common/fileback.cpp
 // Purpose:     Back an input stream with memory or a file
 // Author:      Mike Wetherell
-// RCS-ID:      $Id$
 // Copyright:   (c) 2006 Mike Wetherell
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -14,9 +13,9 @@
     #pragma hdrstop
 #endif
 
-#if wxUSE_BACKINGFILE
+#if wxUSE_FILESYSTEM
 
-#include "wx/fileback.h"
+#include "wx/private/fileback.h"
 
 #ifndef WX_PRECOMP
     #include "wx/utils.h"
@@ -82,8 +81,8 @@ wxBackingFileImpl::wxBackingFileImpl(wxInputStream *stream,
 {
     wxFileOffset len = m_stream->GetLength();
 
-    if (len >= 0 && len + size_t(0) < m_bufsize)
-        m_bufsize = len;
+    if (len >= 0 && len + size_t(1) < m_bufsize)
+        m_bufsize = size_t(len + 1);
 
     if (m_bufsize)
         m_buf = new char[m_bufsize];
@@ -114,7 +113,7 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos,
         size1 = reqestedSize;
         size2 = 0;
     } else if (pos < m_filelen) {
-        size1 = m_filelen - pos;
+        size1 = size_t(m_filelen - pos);
         size2 = reqestedSize - size1;
     } else {
         size1 = 0;
@@ -168,11 +167,9 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos,
                     m_filelen += count;
 
                     if (count < m_buflen) {
-                        delete m_stream;
-                        m_stream = NULL;
+                        wxDELETE(m_stream);
                         if (count > 0) {
-                            delete m_buf;
-                            m_buf = NULL;
+                            wxDELETEA(m_buf);
                             m_buflen = 0;
                         }
                         m_parenterror = wxSTREAM_READ_ERROR;
@@ -182,8 +179,7 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos,
                     m_buflen = 0;
 
                     if (!m_stream) {
-                        delete m_buf;
-                        m_buf = NULL;
+                        wxDELETEA(m_buf);
                     }
                 }
 
@@ -197,13 +193,12 @@ wxStreamError wxBackingFileImpl::ReadAt(wxFileOffset pos,
                     m_parenterror = m_stream->GetLastError();
                     if (m_parenterror == wxSTREAM_NO_ERROR)
                         m_parenterror = wxSTREAM_EOF;
-                    delete m_stream;
-                    m_stream = NULL;
+                    wxDELETE(m_stream);
                 }
             }
 
             // copy to the user's buffer
-            size_t start = pos - m_filelen;
+            size_t start = size_t(pos - m_filelen);
             size_t len = wxMin(m_buflen - start, reqestedSize - *size);
 
             memcpy((char*)buffer + *size, m_buf + start, len);
@@ -271,6 +266,29 @@ wxBackedInputStream::wxBackedInputStream(const wxBackingFile& backer)
 {
 }
 
+wxFileOffset wxBackedInputStream::GetLength() const
+{
+    return m_backer.m_impl->GetLength();
+}
+
+wxFileOffset wxBackedInputStream::FindLength() const
+{
+    wxFileOffset len = GetLength();
+
+    if (len == wxInvalidOffset && IsOk()) {
+        // read a byte at 7ff...ffe
+        wxFileOffset pos = 1;
+        pos <<= sizeof(pos) * 8 - 1;
+        pos = ~pos - 1;
+        char ch;
+        size_t size = 1;
+        m_backer.m_impl->ReadAt(pos, &ch, &size);
+        len = GetLength();
+    }
+
+    return len;
+}
+
 size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size)
 {
     if (!IsOk())
@@ -281,11 +299,6 @@ size_t wxBackedInputStream::OnSysRead(void *buffer, size_t size)
     return size;
 }
 
-wxFileOffset wxBackedInputStream::GetLength() const
-{
-    return m_backer.m_impl->GetLength();
-}
-
 wxFileOffset wxBackedInputStream::OnSysSeek(wxFileOffset pos, wxSeekMode mode)
 {
     switch (mode) {
@@ -317,4 +330,4 @@ wxFileOffset wxBackedInputStream::OnSysTell() const
     return m_pos;
 }
 
-#endif // wxUSE_BACKINGFILE
+#endif // wxUSE_FILESYSTEM