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:
@@ -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()
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user