From: Václav Slavík Date: Sun, 21 Jul 2002 22:29:08 +0000 (+0000) Subject: Unicodification of wxDataStreams X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/a99acbb00a102458b8ad5ba4459712ba73d8b14d Unicodification of wxDataStreams git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16246 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/latex/wx/datistrm.tex b/docs/latex/wx/datistrm.tex index 5b08130575..9c7b18b4b0 100644 --- a/docs/latex/wx/datistrm.tex +++ b/docs/latex/wx/datistrm.tex @@ -43,13 +43,20 @@ None \func{}{wxDataInputStream}{\param{wxInputStream\&}{ stream}} +\func{}{wxDataInputStream}{\param{wxInputStream\&}{ stream}, \param{wxMBConv\&}{ conv = wxMBConvUTF8}} + Constructs a datastream object from an input stream. Only read methods will -be available. +be available. The second form is only available in Unicode build of wxWindows. \wxheading{Parameters} \docparam{stream}{The input stream.} +\docparam{conv}{Charset conversion object object used to decode strings in Unicode +mode (see \helpref{wxDataInputStream::ReadString}{wxdatainputstreamreadstring} +documentation for detailed description). Note that you must not destroy +{\it conv} before you destroy this wxDataInputStream instance!} + \membersection{wxDataInputStream::\destruct{wxDataInputStream}} \func{}{\destruct{wxDataInputStream}}{\void} @@ -89,12 +96,17 @@ Reads a 32 bit integer from the stream. Reads a double (IEEE encoded) from the stream. -\membersection{wxDataInputStream::ReadString} +\membersection{wxDataInputStream::ReadString}\label{wxdatainputstreamreadstring} \func{wxString}{ReadString}{\void} -Reads a string from a stream. Actually, this function first reads a long integer -specifying the length of the string (without the last null character) and then -reads the string. +Reads a string from a stream. Actually, this function first reads a long +integer specifying the length of the string (without the last null character) +and then reads the string. +In Unicode build of wxWindows, the fuction first reads multibyte (char*) +string from the stream and then converts it to Unicode using the {\it conv} +object passed to constructor and returns the result as wxString. You are +responsible for using the same convertor as when writing the stream. +See also \helpref{wxDataOutputStream::WriteString}{wxdataoutputstreamwritestring}. diff --git a/docs/latex/wx/datostrm.tex b/docs/latex/wx/datostrm.tex index d06d31cec2..5e5dd04781 100644 --- a/docs/latex/wx/datostrm.tex +++ b/docs/latex/wx/datostrm.tex @@ -23,13 +23,22 @@ None \func{}{wxDataOutputStream}{\param{wxOutputStream\&}{ stream}} +\func{}{wxDataOutputStream}{\param{wxOutputStream\&}{ stream}, \param{wxMBConv\&}{ conv = wxMBConvUTF8}} + Constructs a datastream object from an output stream. Only write methods will -be available. +be available. The second form is only available in Unicode build of wxWindows. \wxheading{Parameters} \docparam{stream}{The output stream.} +\docparam{conv}{Charset conversion object object used to encoding Unicode +strings before writing them to the stream +in Unicode mode (see \helpref{wxDataOutputStream::WriteString}{wxdataoutputstreamwritestring} +documentation for detailed description). Note that you must not destroy +{\it conv} before you destroy this wxDataOutputStream instance! It is +recommended to use default value (UTF-8).} + \membersection{wxDataOutputStream::\destruct{wxDataOutputStream}} \func{}{\destruct{wxDataOutputStream}}{\void} @@ -69,10 +78,17 @@ Writes the 32 bit integer {\it i32} to the stream. Writes the double {\it f} to the stream using the IEEE format. -\membersection{wxDataOutputStream::WriteString} +\membersection{wxDataOutputStream::WriteString}\label{wxdataoutputstreamwritestring} + +\func{void}{WriteString}{{\param const wxString\&}{string}} -\func{void}{WriteString}{{\param const wxString\& }{string}} Writes {\it string} to the stream. Actually, this method writes the size of the string before writing {\it string} itself. +In ANSI build of wxWindows, the string is written to the stream in exactly +same way it is represented in memory. In Unicode build, however, the string +is first converted to multibyte representation with {\it conv} object passed +to stream's constructor (consequently, ANSI application can read data +written by Unicode application, as long as they agree on encoding) and this +representation is written to the stream. UTF-8 is used by default. diff --git a/include/wx/datstrm.h b/include/wx/datstrm.h index a222f1bc1a..23630e63e2 100644 --- a/include/wx/datstrm.h +++ b/include/wx/datstrm.h @@ -18,13 +18,18 @@ #include "wx/stream.h" #include "wx/longlong.h" +#include "wx/strconv.h" #if wxUSE_STREAMS class WXDLLEXPORT wxDataInputStream { public: +#if wxUSE_UNICODE + wxDataInputStream(wxInputStream& s, wxMBConv& conv = wxConvUTF8); +#else wxDataInputStream(wxInputStream& s); +#endif ~wxDataInputStream(); bool IsOk() { return m_input->IsOk(); } @@ -52,12 +57,19 @@ public: protected: wxInputStream *m_input; bool m_be_order; +#if wxUSE_UNICODE + wxMBConv& m_conv; +#endif }; class WXDLLEXPORT wxDataOutputStream { public: +#if wxUSE_UNICODE + wxDataOutputStream(wxOutputStream& s, wxMBConv& conv = wxConvUTF8); +#else wxDataOutputStream(wxOutputStream& s); +#endif ~wxDataOutputStream(); bool IsOk() { return m_output->IsOk(); } @@ -86,6 +98,9 @@ public: protected: wxOutputStream *m_output; bool m_be_order; +#if wxUSE_UNICODE + wxMBConv& m_conv; +#endif }; #endif diff --git a/src/common/datstrm.cpp b/src/common/datstrm.cpp index f9f974012e..4b37033048 100644 --- a/src/common/datstrm.cpp +++ b/src/common/datstrm.cpp @@ -28,8 +28,13 @@ // wxDataInputStream // --------------------------------------------------------------------------- +#if wxUSE_UNICODE +wxDataInputStream::wxDataInputStream(wxInputStream& s, wxMBConv& conv) + : m_input(&s), m_be_order(FALSE), m_conv(conv) +#else wxDataInputStream::wxDataInputStream(wxInputStream& s) : m_input(&s), m_be_order(FALSE) +#endif { } @@ -108,7 +113,7 @@ wxString wxDataInputStream::ReadString() char *tmp = new char[len + 1]; m_input->Read(tmp, len); tmp[len] = 0; - wxString s(tmp); + wxString s(tmp, m_conv); delete[] tmp; #else wxString s; @@ -185,8 +190,13 @@ wxDataInputStream& wxDataInputStream::operator>>(float& f) // wxDataOutputStream // --------------------------------------------------------------------------- +#if wxUSE_UNICODE +wxDataOutputStream::wxDataOutputStream(wxOutputStream& s, wxMBConv& conv) + : m_output(&s), m_be_order(FALSE), m_conv(conv) +#else wxDataOutputStream::wxDataOutputStream(wxOutputStream& s) : m_output(&s), m_be_order(FALSE) +#endif { } @@ -235,10 +245,15 @@ void wxDataOutputStream::Write8(wxUint8 i) void wxDataOutputStream::WriteString(const wxString& string) { +#if wxUSE_UNICODE + const wxWX2MBbuf buf = string.mb_str(m_conv); +#else const wxWX2MBbuf buf = string.mb_str(); - Write32(string.Len()); - if (string.Len() > 0) - m_output->Write(buf, string.Len()); +#endif + size_t len = strlen(buf); + Write32(len); + if (len > 0) + m_output->Write(buf, len); } // Must be at global scope for VC++ 5