\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}
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}.
\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}
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.
#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(); }
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(); }
protected:
wxOutputStream *m_output;
bool m_be_order;
+#if wxUSE_UNICODE
+ wxMBConv& m_conv;
+#endif
};
#endif
// 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
{
}
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;
// 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
{
}
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