]> git.saurik.com Git - wxWidgets.git/commitdiff
Unicodification of wxDataStreams
authorVáclav Slavík <vslavik@fastmail.fm>
Sun, 21 Jul 2002 22:29:08 +0000 (22:29 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sun, 21 Jul 2002 22:29:08 +0000 (22:29 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16246 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/datistrm.tex
docs/latex/wx/datostrm.tex
include/wx/datstrm.h
src/common/datstrm.cpp

index 5b08130575467b6fa0340cf1aeafb4971a8c3560..9c7b18b4b0f3636df43f862f0c5721a3c847417d 100644 (file)
@@ -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}.
index d06d31cec2875d2c1588b92f887a0245060ef188..5e5dd047819090d3173adcac7c198b572b5bbca3 100644 (file)
@@ -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.
index a222f1bc1aa48112e354e474819745448bef9fed..23630e63e2c0e0343c9ac0865c6bca4ac037824e 100644 (file)
 
 #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
index f9f974012e97369dd51275b5be76cca4522c964f..4b37033048d74a0186b4bddb905b23093a4157f2 100644 (file)
 // 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