From 2979ddbe2ff400c8272b92661cf763782ff868b7 Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Wed, 20 Jun 2012 07:16:03 +0000 Subject: [PATCH] using UTType constants wherever possible to avoid typos, checking for failed conversions, leveraging native conversion of types, fixes #13442 git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@71809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/carbon/dataobj.cpp | 61 ++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/src/osx/carbon/dataobj.cpp b/src/osx/carbon/dataobj.cpp index e3da7cd7ec..f270fb06a0 100644 --- a/src/osx/carbon/dataobj.cpp +++ b/src/osx/carbon/dataobj.cpp @@ -121,26 +121,26 @@ void wxDataFormat::SetType( wxDataFormatId dataType ) switch (m_type) { case wxDF_TEXT: - m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.plain-text") ); + m_format = (long) CFStringCreateCopy( NULL, kUTTypePlainText ); break; case wxDF_UNICODETEXT: - m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.utf16-plain-text") ); + m_format = (long) CFStringCreateCopy( NULL, kUTTypeUTF16PlainText ); break; case wxDF_HTML: - m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.html") ); + m_format = (long) CFStringCreateCopy( NULL, kUTTypeHTML ); break; case wxDF_BITMAP: - m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.tiff") ); + m_format = (long) CFStringCreateCopy( NULL, kUTTypeTIFF ); break; case wxDF_METAFILE: - m_format = (long) CFStringCreateCopy( NULL, CFSTR("com.adobe.pdf") ); + m_format = (long) CFStringCreateCopy( NULL, kUTTypePDF ); break; case wxDF_FILENAME: - m_format = (long) CFStringCreateCopy( NULL, CFSTR("public.file-url") ); + m_format = (long) CFStringCreateCopy( NULL, kUTTypeFileURL ); break; default: @@ -162,31 +162,35 @@ void wxDataFormat::SetId( NativeFormat format ) m_format = 0; } m_format = (NativeFormat) CFStringCreateCopy(NULL, (CFStringRef)format); - if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.html") ) ) + if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeHTML ) ) { m_type = wxDF_HTML; } - if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-plain-text") ) ) + if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeUTF16PlainText ) ) { m_type = wxDF_UNICODETEXT; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.utf16-external-plain-text") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format,kUTTypeUTF16ExternalPlainText ) ) { m_type = wxDF_UNICODETEXT; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.plain-text") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format,kUTTypeUTF8PlainText ) ) + { + m_type = wxDF_UNICODETEXT; + } + else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypePlainText ) ) { m_type = wxDF_TEXT; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.tiff") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeImage ) ) { m_type = wxDF_BITMAP; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("com.adobe.pdf") ) ) + else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypePDF ) ) { m_type = wxDF_METAFILE; } - else if ( UTTypeConformsTo( (CFStringRef)format, CFSTR("public.file-url") ) || + else if ( UTTypeConformsTo( (CFStringRef)format, kUTTypeFileURL ) || UTTypeConformsTo( (CFStringRef)format, kPasteboardTypeFileURLPromise)) { m_type = wxDF_FILENAME; @@ -272,13 +276,31 @@ void wxDataObject::AddToPasteboard( void * pb, int itemID ) // string including trailing zero size_t datasize = GetDataSize( thisFormat ); + if ( datasize == wxCONV_FAILED && thisFormat.GetType() == wxDF_TEXT) + { + // conversion to local text failed, so we must use unicode + // if wxDF_UNICODETEXT is already on the 'todo' list, skip this iteration + // otherwise force it + size_t j = 0; + for (j = 0; j < GetFormatCount(); j++) + { + if ( array[j].GetType() == wxDF_UNICODETEXT ) + break; + } + if ( j < GetFormatCount() ) + continue; + + thisFormat.SetType(wxDF_UNICODETEXT); + datasize = GetDataSize( thisFormat ); + } + size_t sz = datasize + 4; void* buf = malloc( sz ); if ( buf != NULL ) { // empty the buffer because in some case GetDataHere does not fill buf memset( buf, 0, sz ); - if ( GetDataHere( array[ i ], buf ) ) + if ( GetDataHere( thisFormat, buf ) ) { int counter = 1 ; if ( thisFormat.GetType() == wxDF_FILENAME ) @@ -416,11 +438,6 @@ bool wxDataObject::GetFromPasteboard( void * pb ) flavorType = (CFStringRef)CFArrayGetValueAtIndex( flavorTypeArray, flavorIndex ); - // avoid utf8 being treated closer to plain-text than unicode by forcing a conversion - if ( UTTypeConformsTo(flavorType, CFSTR("public.utf8-plain-text") ) ) - { - flavorType = CFSTR("public.utf16-plain-text"); - } wxDataFormat flavorFormat( (wxDataFormat::NativeFormat) flavorType ); if ( dataFormat == flavorFormat ) @@ -436,6 +453,12 @@ bool wxDataObject::GetFromPasteboard( void * pb ) wxCFRef dest(CFURLCreateFromFileSystemRepresentation(NULL,(const UInt8*)result,strlen(result),true)); PasteboardSetPasteLocation(pasteboard, dest); } + else if ( flavorFormat.GetType() != wxDF_PRIVATE ) + { + // indicate the expected format for the type, benefiting from native conversions eg utf8 -> utf16 + flavorType = (CFStringRef) wxDataFormat( flavorFormat.GetType()).GetFormatId(); + } + err = PasteboardCopyItemFlavorData( pasteboard, itemID, flavorType , &flavorData ); if ( err == noErr ) { -- 2.47.2