]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/sstream.cpp
Fix from Jed Burgess that correctly untoggles radio toolbar items when
[wxWidgets.git] / src / common / sstream.cpp
index 7ceedb65b59db5aecc3e37edb92698e7069deac5..1a87534dc31c7be7571e061c206a0556d995e0ec 100644 (file)
@@ -38,6 +38,8 @@
 
 off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode)
 {
+    const size_t ofsMax = m_str.length()*sizeof(wxChar);
+
     switch ( mode )
     {
         case wxFromStart:
@@ -45,7 +47,7 @@ off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode)
             break;
 
         case wxFromEnd:
-            ofs += m_str.length()*sizeof(wxChar);
+            ofs += ofsMax;
             break;
 
         case wxFromCurrent:
@@ -57,6 +59,9 @@ off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode)
             return wxInvalidOffset;
     }
 
+    if ( ofs < 0 || wx_static_cast(size_t, ofs) >= ofsMax )
+        return wxInvalidOffset;
+
     m_pos = wx_static_cast(size_t, ofs);
 
     return ofs;
@@ -96,6 +101,15 @@ size_t wxStringInputStream::OnSysRead(void *buffer, size_t size)
 // wxStringOutputStream implementation
 // ============================================================================
 
+// ----------------------------------------------------------------------------
+// seek/tell
+// ----------------------------------------------------------------------------
+
+off_t wxStringOutputStream::OnSysTell() const
+{
+    return wx_static_cast(off_t, m_pos);
+}
+
 // ----------------------------------------------------------------------------
 // actual IO
 // ----------------------------------------------------------------------------
@@ -107,10 +121,13 @@ size_t wxStringOutputStream::OnSysWrite(const void *buffer, size_t size)
 
     const wxChar *p = wx_static_cast(const wxChar *, buffer);
 
-    m_str->Append(wxString(p, p + len + 1));
+    m_str->Append(wxString(p, p + len));
 
     // return number of bytes actually written
-    return len*sizeof(wxChar);
+    len *= sizeof(wxChar);
+    m_pos += len;
+
+    return len;
 }
 
 #endif // wxUSE_STREAMS