add possibility to specify the conversion to use in wxStringOutputStream; use it instead of reimplementing the same logic erroneously in wxHTML (bug 1711476)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2008-04-15 12:22:41 +00:00
parent 02e9bde2ef
commit 63482fd5e8
3 changed files with 30 additions and 38 deletions

View File

@@ -59,9 +59,14 @@ class WXDLLIMPEXP_BASE wxStringOutputStream : public wxOutputStream
public: public:
// The stream will write data either to the provided string or to an // The stream will write data either to the provided string or to an
// internal string which can be retrieved using GetString() // internal string which can be retrieved using GetString()
wxStringOutputStream(wxString *pString = NULL) //
// Note that the conversion object should have the life time greater than
// this stream.
wxStringOutputStream(wxString *pString = NULL,
wxMBConv& conv = wxConvUTF8)
: m_conv(conv)
#if wxUSE_UNICODE_WCHAR #if wxUSE_UNICODE_WCHAR
: m_unconv(0) , m_unconv(0)
#endif // wxUSE_UNICODE_WCHAR #endif // wxUSE_UNICODE_WCHAR
{ {
m_str = pString ? pString : &m_strInternal; m_str = pString ? pString : &m_strInternal;
@@ -85,12 +90,10 @@ private:
// position in the stream in bytes, *not* in chars // position in the stream in bytes, *not* in chars
size_t m_pos; size_t m_pos;
#if wxUSE_WCHAR_T // converter to use: notice that with the default UTF-8 one the input
// string encoding converter (UTF8 is the standard) // stream must contain valid UTF-8 data, use wxConvISO8859_1 to work with
wxMBConvUTF8 m_conv; // arbitrary 8 bit data
#else wxMBConv& m_conv;
wxMBConv m_conv;
#endif
#if wxUSE_UNICODE_WCHAR #if wxUSE_UNICODE_WCHAR
// unconverted data from the last call to OnSysWrite() // unconverted data from the last call to OnSysWrite()

View File

@@ -44,20 +44,29 @@ class wxStringOutputStream : public wxOutputStream
{ {
public: public:
/** /**
Construct a new stream object writing the data to a string.
If the provided pointer is non-@NULL, data will be written to it. If the provided pointer is non-@NULL, data will be written to it.
Otherwise, an internal string is used for the data written to this stream, use Otherwise, an internal string is used for the data written to this
GetString() to get access to it. stream, use GetString() to get access to it.
If @a str is used, data written to the stream is appended to the current If @a str is used, data written to the stream is appended to the current
contents of it, i.e. the string is not cleared here. However if it is not contents of it, i.e. the string is not cleared here. However if it is not
empty, the positions returned by wxOutputStream::TellO will be empty, the positions returned by wxOutputStream::TellO will be
offset by the initial string length, i.e. initial stream position will be the offset by the initial string length, i.e. initial stream position will be the
initial length of the string and not 0. initial length of the string and not 0.
Notice that the life time of @a conv must be greater than the life time
of this object itself as it stores a reference to it. Also notice that
with default value of this argument the data written to the stream must
be valid UTF-8, pass @c wxConvISO8859_1 to deal with arbitrary 8 bit
data.
*/ */
wxStringOutputStream(wxString str = NULL); wxStringOutputStream(wxString str = NULL, wxMBConv& conv = wxConvUTF8);
/** /**
Returns the string containing all the data written to the stream so far. Returns the string containing all the data written to the stream so far.
*/ */
const wxString GetString() const; const wxString& GetString() const;
}; };

View File

@@ -21,37 +21,17 @@
#endif #endif
#include "wx/strconv.h" #include "wx/strconv.h"
#include "wx/sstream.h"
#include "wx/html/htmlfilt.h" #include "wx/html/htmlfilt.h"
#include "wx/html/htmlwin.h" #include "wx/html/htmlwin.h"
// utility function: read a wxString from a wxInputStream // utility function: read entire contents of an wxInputStream into a wxString
//
// TODO: error handling?
static void ReadString(wxString& str, wxInputStream* s, wxMBConv& conv) static void ReadString(wxString& str, wxInputStream* s, wxMBConv& conv)
{ {
size_t streamSize = s->GetSize(); wxStringOutputStream out(&str, conv);
s->Read(out);
if (streamSize == ~(size_t)0)
{
const size_t bufSize = 4095;
char buffer[bufSize+1];
size_t lastRead;
do
{
s->Read(buffer, bufSize);
lastRead = s->LastRead();
buffer[lastRead] = 0;
str.Append(wxString(buffer, conv));
}
while (lastRead == bufSize);
}
else
{
char* src = new char[streamSize+1];
s->Read(src, streamSize);
src[streamSize] = 0;
str = wxString(src, conv);
delete[] src;
}
} }
/* /*