]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sstream.cpp
Move some OLE utilities to oleutils.cpp and simplified date conversion
[wxWidgets.git] / src / common / sstream.cpp
index 7ceedb65b59db5aecc3e37edb92698e7069deac5..8033dff28c97ced7ec0777d2b3843c0948b74f62 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        common/sstream.cpp
 // Purpose:     string-based streams implementation
 // Author:      Vadim Zeitlin
-// Modified by:
+// Modified by: Ryan Norton (UTF8 UNICODE)
 // Created:     2004-09-19
 // RCS-ID:      $Id$
 // Copyright:   (c) 2004 Vadim Zeitlin <vadim@wxwindows.org>
 // wxStringInputStream implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// construction/destruction
+// ----------------------------------------------------------------------------
+
+// TODO:  Do we want to include the null char in the stream?  If so then
+// just add +1 to m_len in the ctor 
+wxStringInputStream::wxStringInputStream(const wxString& s) 
+#if wxUSE_UNICODE
+    : m_str(s), m_buf(wxMBConvUTF8().cWX2MB(s).release()), m_len(strlen(m_buf))
+#else
+    : m_str(s), m_buf((char*)s.c_str()), m_len(s.length())
+#endif
+{
+#if wxUSE_UNICODE
+    wxASSERT_MSG(m_buf != NULL, _T("Could not convert string to UTF8!"));
+#endif
+    m_pos = 0;
+}
+
+wxStringInputStream::~wxStringInputStream()
+{
+#if wxUSE_UNICODE
+    // Note: wx[W]CharBuffer uses malloc()/free()
+    free(m_buf);
+#endif
+}
+
+// ----------------------------------------------------------------------------
+// getlength
+// ----------------------------------------------------------------------------
+
+wxFileOffset wxStringInputStream::GetLength() const 
+{ 
+    return m_len; 
+}
+
 // ----------------------------------------------------------------------------
 // seek/tell
 // ----------------------------------------------------------------------------
 
-off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode)
+wxFileOffset wxStringInputStream::OnSysSeek(wxFileOffset ofs, wxSeekMode mode)
 {
     switch ( mode )
     {
@@ -45,7 +81,7 @@ off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode)
             break;
 
         case wxFromEnd:
-            ofs += m_str.length()*sizeof(wxChar);
+            ofs += m_len;
             break;
 
         case wxFromCurrent:
@@ -57,14 +93,18 @@ off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode)
             return wxInvalidOffset;
     }
 
-    m_pos = wx_static_cast(size_t, ofs);
+    if ( ofs < 0 || ofs > wx_static_cast(wxFileOffset, m_len) )
+        return wxInvalidOffset;
+
+    // FIXME: this can't be right
+    m_pos = wx_truncate_cast(size_t, ofs);
 
     return ofs;
 }
 
-off_t wxStringInputStream::OnSysTell() const
+wxFileOffset wxStringInputStream::OnSysTell() const
 {
-    return wx_static_cast(off_t, m_pos);
+    return wx_static_cast(wxFileOffset, m_pos);
 }
 
 // ----------------------------------------------------------------------------
@@ -73,7 +113,7 @@ off_t wxStringInputStream::OnSysTell() const
 
 size_t wxStringInputStream::OnSysRead(void *buffer, size_t size)
 {
-    const size_t sizeMax = m_str.length()*sizeof(wxChar) - m_pos;
+    const size_t sizeMax = m_len - m_pos;
 
     if ( size >= sizeMax )
     {
@@ -86,7 +126,7 @@ size_t wxStringInputStream::OnSysRead(void *buffer, size_t size)
         size = sizeMax;
     }
 
-    memcpy(buffer, m_str.data() + m_pos, size);
+    memcpy(buffer, m_buf + m_pos, size);
     m_pos += size;
 
     return size;
@@ -96,21 +136,32 @@ size_t wxStringInputStream::OnSysRead(void *buffer, size_t size)
 // wxStringOutputStream implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// seek/tell
+// ----------------------------------------------------------------------------
+
+wxFileOffset wxStringOutputStream::OnSysTell() const
+{
+    return wx_static_cast(wxFileOffset, m_pos);
+}
+
 // ----------------------------------------------------------------------------
 // actual IO
 // ----------------------------------------------------------------------------
 
 size_t wxStringOutputStream::OnSysWrite(const void *buffer, size_t size)
 {
-    // in Unicode mode we might not be able to write the last byte
-    size_t len = size / sizeof(wxChar);
+    const char *p = wx_static_cast(const char *, buffer);
 
-    const wxChar *p = wx_static_cast(const wxChar *, buffer);
+    // append the input buffer (may not be null terminated - thus 
+    // the literal length
+    m_str->Append(wxString(p, m_conv, size));
 
-    m_str->Append(wxString(p, p + len + 1));
+    // update position
+    m_pos += size;
 
     // return number of bytes actually written
-    return len*sizeof(wxChar);
+    return size;
 }
 
 #endif // wxUSE_STREAMS