]> git.saurik.com Git - wxWidgets.git/commitdiff
add possibility to specify the conversion to use in wxStringOutputStream; use it...
authorVadim Zeitlin <vadim@wxwidgets.org>
Tue, 15 Apr 2008 12:22:41 +0000 (12:22 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Tue, 15 Apr 2008 12:22:41 +0000 (12:22 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@53179 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/sstream.h
interface/sstream.h
src/html/htmlfilt.cpp

index 1b2cbd08977d45f60ac3afad6b2511ce756be0be..61ac6044d52426f3fa1267e86932dc7644e2f45d 100644 (file)
@@ -59,9 +59,14 @@ class WXDLLIMPEXP_BASE wxStringOutputStream : public wxOutputStream
 public:
     // The stream will write data either to the provided string or to an
     // 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
-        : m_unconv(0)
+        , m_unconv(0)
 #endif // wxUSE_UNICODE_WCHAR
     {
         m_str = pString ? pString : &m_strInternal;
@@ -85,12 +90,10 @@ private:
     // position in the stream in bytes, *not* in chars
     size_t m_pos;
 
-#if wxUSE_WCHAR_T
-    // string encoding converter (UTF8 is the standard)
-    wxMBConvUTF8 m_conv;
-#else
-    wxMBConv m_conv;
-#endif
+    // converter to use: notice that with the default UTF-8 one the input
+    // stream must contain valid UTF-8 data, use wxConvISO8859_1 to work with
+    // arbitrary 8 bit data
+    wxMBConv& m_conv;
 
 #if wxUSE_UNICODE_WCHAR
     // unconverted data from the last call to OnSysWrite()
index a950a758485adca1aa1207dd8009dca9f3b69d2d..9fb340b7050ae9cd0dd512e82acef45790fc1975 100644 (file)
@@ -44,20 +44,29 @@ class wxStringOutputStream : public wxOutputStream
 {
 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.
-        Otherwise, an internal string is used for the data written to this stream, use
-        GetString() to get access to it.
+        Otherwise, an internal string is used for the data written to this
+        stream, use GetString() to get access to it.
+
         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
         empty, the positions returned by wxOutputStream::TellO will be
         offset by the initial string length, i.e. initial stream position will be the
         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.
     */
-    const wxString GetString() const;
+    const wxString& GetString() const;
 };
 
index febd5a0354a1f69374737768b80e91e3619ecd69..28c3de9e68acc0d0ac045b9515b26a5173dc6f2a 100644 (file)
 #endif
 
 #include "wx/strconv.h"
+#include "wx/sstream.h"
 #include "wx/html/htmlfilt.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)
 {
-    size_t streamSize = s->GetSize();
-
-    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;
-    }
+    wxStringOutputStream out(&str, conv);
+    s->Read(out);
 }
 
 /*