Fix wxHTMLDataObject compilation and memory leaks.

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
This commit is contained in:
Vadim Zeitlin 2012-06-10 11:57:20 +00:00
parent 0681e07a14
commit f421e3f119

View File

@ -429,19 +429,15 @@ bool wxTextDataObject::SetData(size_t len, const void *buf)
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__
// 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
}
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.
wxCharBuffer html = wxConvUTF8.cWX2MB( GetHTML().c_str() );
const wxScopedCharBuffer html(GetHTML().utf8_str());
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.
char* buffer = new char[bytes];
// 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
wxCharBuffer buffer = html;
strcpy(buffer, html);
#endif // __WXMSW__
memcpy( (char*) buf, buffer, bytes );
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.
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.
#ifdef __WXMSW__
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);
if (startCommentEnd != wxNOT_FOUND && endCommentStart != wxNOT_FOUND)
html = html.Mid(startCommentEnd, endCommentStart - startCommentEnd);
}
#endif
#endif // __WXMSW__
SetHTML( html );
return true;