]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix wxHTMLDataObject compilation and memory leaks.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 10 Jun 2012 11:57:20 +0000 (11:57 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 10 Jun 2012 11:57:20 +0000 (11:57 +0000)
Use wxString::FromUTF8() and utf8_str() instead of directly using wxConvUTF8
as this is simpler and also works correctly in non-Unicode build (and more
efficiently in UTF-8 build as no conversion is done there).

Do not allocate -- and leak -- buffer in wxHTMLDataObject::GetDataHere(),
we're supposed to be putting data into the caller-provided buffer instead of
using our own.

Closes #14391.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71712 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/common/dobjcmn.cpp

index eb2d539c39cf28022b87d367d53303f00a50b020..01a1a6699c0c7bd3722c31b2e4bda46d8efee86f 100644 (file)
@@ -429,19 +429,15 @@ bool wxTextDataObject::SetData(size_t len, const void *buf)
 
 size_t wxHTMLDataObject::GetDataSize() const
 {
 
 size_t wxHTMLDataObject::GetDataSize() const
 {
-    size_t size = 0;
-    // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
-    wxCharBuffer buffer =  wxConvUTF8.cWX2MB( GetHTML().c_str() );
+    const wxScopedCharBuffer buffer(GetHTML().utf8_str());
+
+    size_t size = buffer.length();
 
 
-    if (buffer) 
-    {
-        size = strlen( buffer );
 #ifdef __WXMSW__
 #ifdef __WXMSW__
-        // On Windows we need to add some stuff to the string to satisfy 
-        // its clipboard format requirements.
-        size += 400;
+    // On Windows we need to add some stuff to the string to satisfy
+    // its clipboard format requirements.
+    size += 400;
 #endif
 #endif
-    }
 
     return size;
 }
 
     return size;
 }
@@ -452,14 +448,14 @@ bool wxHTMLDataObject::GetDataHere(void *buf) const
         return false;
 
     // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
         return false;
 
     // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
-    wxCharBuffer html =  wxConvUTF8.cWX2MB( GetHTML().c_str() );
+    const wxScopedCharBuffer html(GetHTML().utf8_str());
     if ( !html )
         return false;
 
     if ( !html )
         return false;
 
-    size_t bytes = GetDataSize();
+    char* const buffer = static_cast<char*>(buf);
+
 #ifdef __WXMSW__
     // add the extra info that the MSW clipboard format requires.
 #ifdef __WXMSW__
     // add the extra info that the MSW clipboard format requires.
-    char* buffer = new char[bytes];
 
         // Create a template string for the HTML header...
     strcpy(buffer,
 
         // Create a template string for the HTML header...
     strcpy(buffer,
@@ -500,11 +496,9 @@ bool wxHTMLDataObject::GetDataHere(void *buf) const
     sprintf(ptr+12, "%08u", (unsigned)(strstr(buffer, "<!--EndFrag") - buffer));
     *(ptr+12+8) = '\r';
 #else
     sprintf(ptr+12, "%08u", (unsigned)(strstr(buffer, "<!--EndFrag") - buffer));
     *(ptr+12+8) = '\r';
 #else
-    wxCharBuffer buffer = html;
+    strcpy(buffer, html);
 #endif // __WXMSW__
 
 #endif // __WXMSW__
 
-    memcpy( (char*) buf, buffer, bytes );
-
     return true;
 }
 
     return true;
 }
 
@@ -514,24 +508,24 @@ bool wxHTMLDataObject::SetData(size_t WXUNUSED(len), const void *buf)
         return false;
 
     // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
         return false;
 
     // Windows and Mac always use UTF-8, and docs suggest GTK does as well.
-    wxWCharBuffer buffer =  wxConvUTF8.cMB2WX( (const char*)buf );
+    const wxString html = wxString::FromUTF8(static_cast<const char*>(buf));
 
 
-    wxString html(buffer);
+#ifdef __WXMSW__
     // To be consistent with other platforms, we only add the Fragment part
     // of the Windows HTML clipboard format to the data object.
     // To be consistent with other platforms, we only add the Fragment part
     // of the Windows HTML clipboard format to the data object.
-#ifdef __WXMSW__
     int fragmentStart = html.rfind("StartFragment");
     int fragmentEnd = html.rfind("EndFragment");
 
     int fragmentStart = html.rfind("StartFragment");
     int fragmentEnd = html.rfind("EndFragment");
 
-    if (fragmentStart != wxNOT_FOUND && fragmentEnd != wxNOT_FOUND) 
+    if (fragmentStart != wxNOT_FOUND && fragmentEnd != wxNOT_FOUND)
     {
         int startCommentEnd = html.find("-->", fragmentStart) + 3;
         int endCommentStart = html.rfind("<!--", fragmentEnd);
     {
         int startCommentEnd = html.find("-->", fragmentStart) + 3;
         int endCommentStart = html.rfind("<!--", fragmentEnd);
-        
+
         if (startCommentEnd != wxNOT_FOUND && endCommentStart != wxNOT_FOUND)
             html = html.Mid(startCommentEnd, endCommentStart - startCommentEnd);
     }
         if (startCommentEnd != wxNOT_FOUND && endCommentStart != wxNOT_FOUND)
             html = html.Mid(startCommentEnd, endCommentStart - startCommentEnd);
     }
-#endif
+#endif // __WXMSW__
+
     SetHTML( html );
 
     return true;
     SetHTML( html );
 
     return true;