X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a5ea75bc6a7e10e71d23ed4a0899bba30c2f5077..82bf96f54849a84b449d1b9f0fcff8f28649b07e:/src/common/sstream.cpp diff --git a/src/common/sstream.cpp b/src/common/sstream.cpp index 1a87534dc3..8033dff28c 100644 --- a/src/common/sstream.cpp +++ b/src/common/sstream.cpp @@ -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 @@ -33,13 +33,47 @@ // ============================================================================ // ---------------------------------------------------------------------------- -// seek/tell +// construction/destruction // ---------------------------------------------------------------------------- -off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode) +// 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() { - const size_t ofsMax = m_str.length()*sizeof(wxChar); +#if wxUSE_UNICODE + // Note: wx[W]CharBuffer uses malloc()/free() + free(m_buf); +#endif +} + +// ---------------------------------------------------------------------------- +// getlength +// ---------------------------------------------------------------------------- +wxFileOffset wxStringInputStream::GetLength() const +{ + return m_len; +} + +// ---------------------------------------------------------------------------- +// seek/tell +// ---------------------------------------------------------------------------- + +wxFileOffset wxStringInputStream::OnSysSeek(wxFileOffset ofs, wxSeekMode mode) +{ switch ( mode ) { case wxFromStart: @@ -47,7 +81,7 @@ off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode) break; case wxFromEnd: - ofs += ofsMax; + ofs += m_len; break; case wxFromCurrent: @@ -59,17 +93,18 @@ off_t wxStringInputStream::OnSysSeek(off_t ofs, wxSeekMode mode) return wxInvalidOffset; } - if ( ofs < 0 || wx_static_cast(size_t, ofs) >= ofsMax ) + if ( ofs < 0 || ofs > wx_static_cast(wxFileOffset, m_len) ) return wxInvalidOffset; - m_pos = wx_static_cast(size_t, ofs); + // 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); } // ---------------------------------------------------------------------------- @@ -78,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 ) { @@ -91,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; @@ -105,9 +140,9 @@ size_t wxStringInputStream::OnSysRead(void *buffer, size_t size) // seek/tell // ---------------------------------------------------------------------------- -off_t wxStringOutputStream::OnSysTell() const +wxFileOffset wxStringOutputStream::OnSysTell() const { - return wx_static_cast(off_t, m_pos); + return wx_static_cast(wxFileOffset, m_pos); } // ---------------------------------------------------------------------------- @@ -116,18 +151,17 @@ off_t wxStringOutputStream::OnSysTell() const 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)); + // update position + m_pos += size; // return number of bytes actually written - len *= sizeof(wxChar); - m_pos += len; - - return len; + return size; } #endif // wxUSE_STREAMS