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:
parent
0681e07a14
commit
f421e3f119
@ -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;
|
const wxScopedCharBuffer buffer(GetHTML().utf8_str());
|
||||||
// Windows and Mac always use UTF-8, and docs suggest GTK does as well.
|
|
||||||
wxCharBuffer buffer = wxConvUTF8.cWX2MB( GetHTML().c_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
|
// On Windows we need to add some stuff to the string to satisfy
|
||||||
// its clipboard format requirements.
|
// its clipboard format requirements.
|
||||||
size += 400;
|
size += 400;
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
@ -452,14 +448,14 @@ bool wxHTMLDataObject::GetDataHere(void *buf) const
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Windows and Mac always use UTF-8, and docs suggest GTK does as well.
|
// 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 )
|
if ( !html )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
size_t bytes = GetDataSize();
|
char* const buffer = static_cast<char*>(buf);
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
#ifdef __WXMSW__
|
||||||
// add the extra info that the MSW clipboard format requires.
|
// add the extra info that the MSW clipboard format requires.
|
||||||
char* buffer = new char[bytes];
|
|
||||||
|
|
||||||
// Create a template string for the HTML header...
|
// Create a template string for the HTML header...
|
||||||
strcpy(buffer,
|
strcpy(buffer,
|
||||||
@ -500,11 +496,9 @@ bool wxHTMLDataObject::GetDataHere(void *buf) const
|
|||||||
sprintf(ptr+12, "%08u", (unsigned)(strstr(buffer, "<!--EndFrag") - buffer));
|
sprintf(ptr+12, "%08u", (unsigned)(strstr(buffer, "<!--EndFrag") - buffer));
|
||||||
*(ptr+12+8) = '\r';
|
*(ptr+12+8) = '\r';
|
||||||
#else
|
#else
|
||||||
wxCharBuffer buffer = html;
|
strcpy(buffer, html);
|
||||||
#endif // __WXMSW__
|
#endif // __WXMSW__
|
||||||
|
|
||||||
memcpy( (char*) buf, buffer, bytes );
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -514,12 +508,11 @@ bool wxHTMLDataObject::SetData(size_t WXUNUSED(len), const void *buf)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Windows and Mac always use UTF-8, and docs suggest GTK does as well.
|
// 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
|
// To be consistent with other platforms, we only add the Fragment part
|
||||||
// of the Windows HTML clipboard format to the data object.
|
// of the Windows HTML clipboard format to the data object.
|
||||||
#ifdef __WXMSW__
|
|
||||||
int fragmentStart = html.rfind("StartFragment");
|
int fragmentStart = html.rfind("StartFragment");
|
||||||
int fragmentEnd = html.rfind("EndFragment");
|
int fragmentEnd = html.rfind("EndFragment");
|
||||||
|
|
||||||
@ -531,7 +524,8 @@ bool wxHTMLDataObject::SetData(size_t WXUNUSED(len), const void *buf)
|
|||||||
if (startCommentEnd != wxNOT_FOUND && endCommentStart != wxNOT_FOUND)
|
if (startCommentEnd != wxNOT_FOUND && endCommentStart != wxNOT_FOUND)
|
||||||
html = html.Mid(startCommentEnd, endCommentStart - startCommentEnd);
|
html = html.Mid(startCommentEnd, endCommentStart - startCommentEnd);
|
||||||
}
|
}
|
||||||
#endif
|
#endif // __WXMSW__
|
||||||
|
|
||||||
SetHTML( html );
|
SetHTML( html );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user