From a99acbb00a102458b8ad5ba4459712ba73d8b14d Mon Sep 17 00:00:00 2001
From: =?utf8?q?V=C3=A1clav=20Slav=C3=ADk?= <vslavik@fastmail.fm>
Date: Sun, 21 Jul 2002 22:29:08 +0000
Subject: [PATCH] Unicodification of wxDataStreams

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16246 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 docs/latex/wx/datistrm.tex | 22 +++++++++++++++++-----
 docs/latex/wx/datostrm.tex | 22 +++++++++++++++++++---
 include/wx/datstrm.h       | 15 +++++++++++++++
 src/common/datstrm.cpp     | 23 +++++++++++++++++++----
 4 files changed, 70 insertions(+), 12 deletions(-)

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
-- 
2.50.0

