diff -r c3cec2243286 vcl/aqua/source/dtrans/DataFlavorMapping.cxx --- a/vcl/aqua/source/dtrans/DataFlavorMapping.cxx Thu Apr 14 17:52:51 2011 +0200 +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx Wed May 11 08:37:38 2011 +0200 @@ -523,6 +523,17 @@ throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("AquaClipboard: Cannot create com.sun.star.datatransfer.MimeContentTypeFactory")), NULL); } +DataFlavorMapper::~DataFlavorMapper() +{ + // release potential NSStrings + for( std::hash_map< rtl::OUString, NSString*, rtl::OUStringHash >::iterator it + = maOfficeOnlyTypes.begin(); it != maOfficeOnlyTypes.end(); ++it ) + { + [it->second release]; + it->second = nil; + } +} + DataFlavor DataFlavorMapper::systemToOpenOfficeFlavor(NSString* systemDataFlavor) const { DataFlavor oOOFlavor; @@ -538,22 +549,44 @@ } } // for - return oOOFlavor; + // look if this might be an internal type; if it comes in here it must have + // been through openOfficeToSystemFlavor before, so it should then be in the map + rtl::OUString aTryFlavor( NSStringToOUString( systemDataFlavor ) ); + if( maOfficeOnlyTypes.find( aTryFlavor ) != maOfficeOnlyTypes.end() ) + { + oOOFlavor.MimeType = aTryFlavor; + oOOFlavor.HumanPresentableName = rtl::OUString(); + oOOFlavor.DataType = CPPUTYPE_SEQINT8; + } + + return oOOFlavor; } NSString* DataFlavorMapper::openOfficeToSystemFlavor(const DataFlavor& oOOFlavor) const { - NSString* sysFlavor = NULL; - - for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++) + NSString* sysFlavor = NULL; + + for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++) { - if (oOOFlavor.MimeType.compareToAscii(flavorMap[i].OOoFlavor, strlen(flavorMap[i].OOoFlavor)) == 0) + if (oOOFlavor.MimeType.compareToAscii(flavorMap[i].OOoFlavor, strlen(flavorMap[i].OOoFlavor)) == 0) { - sysFlavor = flavorMap[i].SystemFlavor; + sysFlavor = flavorMap[i].SystemFlavor; } } - - return sysFlavor; + + if( ! sysFlavor ) + { + std::hash_map::const_iterator it + = maOfficeOnlyTypes.find( oOOFlavor.MimeType ); + if( it == maOfficeOnlyTypes.end() ) + { + sysFlavor = maOfficeOnlyTypes[ oOOFlavor.MimeType ] = OUStringToNSString( oOOFlavor.MimeType ); + } + else + sysFlavor = it->second; + } + + return sysFlavor; } NSString* DataFlavorMapper::openOfficeImageToSystemFlavor(NSPasteboard* pPasteboard) const @@ -690,6 +723,7 @@ if (str != NULL) { + [str retain]; [array addObject: str]; } } diff -r c3cec2243286 vcl/aqua/source/dtrans/DataFlavorMapping.hxx --- a/vcl/aqua/source/dtrans/DataFlavorMapping.hxx Thu Apr 14 17:52:51 2011 +0200 +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.hxx Wed May 11 08:37:38 2011 +0200 @@ -37,6 +37,7 @@ #import #include +#include #include #include @@ -73,6 +74,7 @@ cannot be created. */ DataFlavorMapper(); + ~DataFlavorMapper(); /* Map a system data flavor to an OpenOffice data flavor. @@ -136,6 +138,7 @@ private: ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory> mrXMimeCntFactory; + mutable std::hash_map< rtl::OUString, NSString*, rtl::OUStringHash > maOfficeOnlyTypes; }; typedef boost::shared_ptr DataFlavorMapperPtr_t;