]>
git.saurik.com Git - wxWidgets.git/blob - src/common/sstream.cpp
1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: common/sstream.cpp
3 // Purpose: string-based streams implementation
4 // Author: Vadim Zeitlin
5 // Modified by: Ryan Norton (UTF8 UNICODE)
8 // Copyright: (c) 2004 Vadim Zeitlin <vadim@wxwindows.org>
9 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // ============================================================================
14 // ============================================================================
16 // ----------------------------------------------------------------------------
18 // ----------------------------------------------------------------------------
20 // For compilers that support precompilation, includes "wx.h".
21 #include "wx/wxprec.h"
29 #include "wx/sstream.h"
31 // ============================================================================
32 // wxStringInputStream implementation
33 // ============================================================================
35 // ----------------------------------------------------------------------------
36 // construction/destruction
37 // ----------------------------------------------------------------------------
39 // TODO: Do we want to include the null char in the stream? If so then
40 // just add +1 to m_len in the ctor
41 wxStringInputStream::wxStringInputStream(const wxString
& s
)
43 : m_str(s
), m_buf(wxMBConvUTF8().cWX2MB(s
).release()), m_len(strlen(m_buf
))
45 : m_str(s
), m_buf((char*)(const char*)s
.c_str()), m_len(s
.length())
49 wxASSERT_MSG(m_buf
!= NULL
, _T("Could not convert string to UTF8!"));
54 wxStringInputStream::~wxStringInputStream()
57 // Note: wx[W]CharBuffer uses malloc()/free()
62 // ----------------------------------------------------------------------------
64 // ----------------------------------------------------------------------------
66 wxFileOffset
wxStringInputStream::GetLength() const
71 // ----------------------------------------------------------------------------
73 // ----------------------------------------------------------------------------
75 wxFileOffset
wxStringInputStream::OnSysSeek(wxFileOffset ofs
, wxSeekMode mode
)
80 // nothing to do, ofs already ok
92 wxFAIL_MSG( _T("invalid seek mode") );
93 return wxInvalidOffset
;
96 if ( ofs
< 0 || ofs
> wx_static_cast(wxFileOffset
, m_len
) )
97 return wxInvalidOffset
;
99 // FIXME: this can't be right
100 m_pos
= wx_truncate_cast(size_t, ofs
);
105 wxFileOffset
wxStringInputStream::OnSysTell() const
107 return wx_static_cast(wxFileOffset
, m_pos
);
110 // ----------------------------------------------------------------------------
112 // ----------------------------------------------------------------------------
114 size_t wxStringInputStream::OnSysRead(void *buffer
, size_t size
)
116 const size_t sizeMax
= m_len
- m_pos
;
118 if ( size
>= sizeMax
)
122 m_lasterror
= wxSTREAM_EOF
;
129 memcpy(buffer
, m_buf
+ m_pos
, size
);
135 // ============================================================================
136 // wxStringOutputStream implementation
137 // ============================================================================
139 // ----------------------------------------------------------------------------
141 // ----------------------------------------------------------------------------
143 wxFileOffset
wxStringOutputStream::OnSysTell() const
145 return wx_static_cast(wxFileOffset
, m_pos
);
148 // ----------------------------------------------------------------------------
150 // ----------------------------------------------------------------------------
152 size_t wxStringOutputStream::OnSysWrite(const void *buffer
, size_t size
)
154 const char *p
= wx_static_cast(const char *, buffer
);
156 #if wxUSE_UNICODE_WCHAR
157 // the part of the string we have here may be incomplete, i.e. it can stop
158 // in the middle of an UTF-8 character and so converting it would fail; if
159 // this is the case, accumulate the part which we failed to convert until
160 // we get the rest (and also take into account the part which we might have
161 // left unconverted before)
164 if ( m_unconv
.GetDataLen() )
166 // append the new data to the data remaining since the last time
167 m_unconv
.AppendData(p
, size
);
169 srcLen
= m_unconv
.GetDataLen();
171 else // no unconverted data left, avoid extra copy
177 wxWCharBuffer
wbuf(m_conv
.cMB2WC(src
, srcLen
, NULL
/* out len */));
180 // conversion succeeded, clear the unconverted buffer
181 m_unconv
= wxMemoryBuffer(0);
185 else // conversion failed
187 // remember unconverted data if there had been none before (otherwise
188 // we've already got it in the buffer)
190 m_unconv
.AppendData(src
, srcLen
);
192 // pretend that we wrote the data anyhow, otherwise the caller would
193 // believe there was an error and this might not be the case, but do
194 // not update m_pos as m_str hasn't changed
197 #else // !wxUSE_UNICODE_WCHAR
198 // no recoding necessary, the data is supposed to already be in UTF-8 (if
199 // supported) or ASCII otherwise
200 m_str
->append(p
, size
);
201 #endif // wxUSE_UNICODE_WCHAR/!wxUSE_UNICODE_WCHAR
206 // return number of bytes actually written
210 #endif // wxUSE_STREAMS