From: Ryan Norton Date: Mon, 22 Nov 2004 05:05:04 +0000 (+0000) Subject: UNICODE-capatable UTF8 implementation of wxStringXXXStream X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/c5d99d7b5c4afa4fba509d751937d5e6cb7b2703 UNICODE-capatable UTF8 implementation of wxStringXXXStream git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30686 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/sstream.h b/include/wx/sstream.h index 9926e33700..b264c67021 100644 --- a/include/wx/sstream.h +++ b/include/wx/sstream.h @@ -25,13 +25,10 @@ class WXDLLIMPEXP_BASE wxStringInputStream : public wxInputStream public: // ctor associates the stream with the given string which makes a copy of // it - wxStringInputStream(const wxString& s) - : m_str(s) - { - m_pos = 0; - } + wxStringInputStream(const wxString& s); + virtual ~wxStringInputStream(); - virtual wxFileOffset GetLength() const { return m_str.length(); } + virtual wxFileOffset GetLength() const; protected: virtual wxFileOffset OnSysSeek(wxFileOffset ofs, wxSeekMode mode); @@ -39,13 +36,18 @@ protected: virtual size_t OnSysRead(void *buffer, size_t size); private: - // the string we're reading from + // the string that was passed in the ctor wxString m_str; + // the buffer we're reading from + char* m_buf; + + // length of the buffer we're reading from + size_t m_len; + // position in the stream in bytes, *not* in chars size_t m_pos; - DECLARE_NO_COPY_CLASS(wxStringInputStream) }; @@ -81,6 +83,8 @@ private: // position in the stream in bytes, *not* in chars size_t m_pos; + // string encoding converter (UTF8 is the standard) + wxMBConvUTF8 m_conv; DECLARE_NO_COPY_CLASS(wxStringOutputStream) }; diff --git a/src/common/sstream.cpp b/src/common/sstream.cpp index 84bf9c376d..51d7effef7 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 @@ -32,14 +32,45 @@ // wxStringInputStream implementation // ============================================================================ +// ---------------------------------------------------------------------------- +// construction/destruction +// ---------------------------------------------------------------------------- + +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 + delete m_buf; +#endif +} + +// ---------------------------------------------------------------------------- +// getlength +// ---------------------------------------------------------------------------- + +wxFileOffset wxStringInputStream::GetLength() const +{ + return m_len; +} + // ---------------------------------------------------------------------------- // seek/tell // ---------------------------------------------------------------------------- wxFileOffset wxStringInputStream::OnSysSeek(wxFileOffset ofs, wxSeekMode mode) { - const size_t ofsMax = m_str.length()*sizeof(wxChar); - switch ( mode ) { case wxFromStart: @@ -47,7 +78,7 @@ wxFileOffset wxStringInputStream::OnSysSeek(wxFileOffset ofs, wxSeekMode mode) break; case wxFromEnd: - ofs += ofsMax; + ofs += m_len; break; case wxFromCurrent: @@ -59,7 +90,7 @@ wxFileOffset wxStringInputStream::OnSysSeek(wxFileOffset ofs, wxSeekMode mode) return wxInvalidOffset; } - if ( ofs < 0 || wx_static_cast(size_t, ofs) >= ofsMax ) + if ( ofs < 0 || wx_static_cast(size_t, ofs) >= m_len ) return wxInvalidOffset; m_pos = wx_static_cast(size_t, ofs); @@ -78,7 +109,7 @@ wxFileOffset 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 +122,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; @@ -116,18 +147,16 @@ wxFileOffset 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 wxChar *p = wx_static_cast(const wxChar *, buffer); + const char *p = wx_static_cast(const char *, buffer); - m_str->Append(wxString(p, p + len)); + // append the input buffer (may not be null terminated - thus + // the literal length + m_str->Append(wxString(p, m_conv, size)); // return number of bytes actually written - len *= sizeof(wxChar); - m_pos += len; + m_pos += size; - return len; + return size; } #endif // wxUSE_STREAMS