From 9fccdcaf810e543e28bca662300b5936ad7acf30 Mon Sep 17 00:00:00 2001 From: Herbert Dürr Date: Mon, 14 May 2012 15:10:16 +0000 Subject: (author=pl) fix for transporting OOo types through OSX system clipboard Change-Id: Idc00fbc8ac1adb04c76ecb4b641cfa055f5901b8 --- vcl/aqua/source/dtrans/DataFlavorMapping.cxx | 60 +++++++++++++++++++++++++--- vcl/aqua/source/dtrans/DataFlavorMapping.hxx | 4 ++ 2 files changed, 58 insertions(+), 6 deletions(-) (limited to 'vcl/aqua') diff --git a/vcl/aqua/source/dtrans/DataFlavorMapping.cxx b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx index 23dbfd4513fb..b030ac8e0fb1 100644 --- a/vcl/aqua/source/dtrans/DataFlavorMapping.cxx +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx @@ -50,6 +50,8 @@ using ::rtl::OString; namespace // private { + const Type CPPUTYPE_SEQINT8 = getCppuType((Sequence*)0); + /* Determine whether or not a DataFlavor is valid. */ bool isValidFlavor(const DataFlavor& aFlavor) @@ -59,6 +61,22 @@ namespace // private return ((len > 0) && ((dtype == getCppuType((Sequence*)0)) || (dtype == getCppuType( (OUString*)0 )))); } + OUString NSStringToOUString(NSString* cfString) + { + BOOST_ASSERT(cfString && "Invalid parameter"); + + const char* utf8Str = [cfString UTF8String]; + unsigned int len = rtl_str_getLength(utf8Str); + + return OUString(utf8Str, len, RTL_TEXTENCODING_UTF8); + } + + NSString* OUStringToNSString(const OUString& ustring) + { + OString utf8Str = OUStringToOString(ustring, RTL_TEXTENCODING_UTF8); + return [NSString stringWithCString: utf8Str.getStr() encoding: NSUTF8StringEncoding]; + } + NSString* PBTYPE_SODX = @"application/x-openoffice-objectdescriptor-xml;windows_formatname=\"Star Object Descriptor (XML)\""; NSString* PBTYPE_SESX = @"application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""; NSString* PBTYPE_SLSDX = @"application/x-openoffice-linksrcdescriptor-xml;windows_formatname=\"Star Link Source Descriptor (XML)\""; @@ -499,6 +517,16 @@ DataFlavorMapper::DataFlavorMapper() mrXMimeCntFactory = MimeContentTypeFactory::create( xContext ); } +DataFlavorMapper::~DataFlavorMapper() +{ + // release potential NSStrings + for( OfficeOnlyTypes::iterator it = maOfficeOnlyTypes.begin(); it != maOfficeOnlyTypes.end(); ++it ) + { + [it->second release]; + it->second = nil; + } +} + DataFlavor DataFlavorMapper::systemToOpenOfficeFlavor(NSString* systemDataFlavor) const { DataFlavor oOOFlavor; @@ -514,22 +542,41 @@ DataFlavor DataFlavorMapper::systemToOpenOfficeFlavor(NSString* systemDataFlavor } } // 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 + OUString aTryFlavor( NSStringToOUString( systemDataFlavor ) ); + if( maOfficeOnlyTypes.find( aTryFlavor ) != maOfficeOnlyTypes.end() ) + { + oOOFlavor.MimeType = aTryFlavor; + oOOFlavor.HumanPresentableName = OUString(); + oOOFlavor.DataType = CPPUTYPE_SEQINT8; + } + + return oOOFlavor; } NSString* DataFlavorMapper::openOfficeToSystemFlavor(const DataFlavor& oOOFlavor) const { - NSString* sysFlavor = NULL; + NSString* sysFlavor = NULL; - for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++) + for( size_t i = 0; i < SIZE_FLAVOR_MAP; ++i ) { - if (oOOFlavor.MimeType.startsWith(OUString::createFromAscii(flavorMap[i].OOoFlavor))) + if (oOOFlavor.MimeType.startsWith(OUString::createFromAscii(flavorMap[i].OOoFlavor))) { - sysFlavor = flavorMap[i].SystemFlavor; + sysFlavor = flavorMap[i].SystemFlavor; } } - return sysFlavor; + if( ! sysFlavor ) + { + OfficeOnlyTypes::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 @@ -668,6 +715,7 @@ NSArray* DataFlavorMapper::flavorSequenceToTypesArray(const com::sun::star::uno: if (str != NULL) { + [str retain]; [array addObject: str]; } } diff --git a/vcl/aqua/source/dtrans/DataFlavorMapping.hxx b/vcl/aqua/source/dtrans/DataFlavorMapping.hxx index 3efe8cff056e..7ef36401c3ca 100644 --- a/vcl/aqua/source/dtrans/DataFlavorMapping.hxx +++ b/vcl/aqua/source/dtrans/DataFlavorMapping.hxx @@ -29,6 +29,7 @@ #import #include +#include #include #include @@ -65,6 +66,7 @@ public: cannot be created. */ DataFlavorMapper(); + ~DataFlavorMapper(); /* Map a system data flavor to an OpenOffice data flavor. @@ -128,6 +130,8 @@ private: private: ::com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XMimeContentTypeFactory> mrXMimeCntFactory; + typedef boost::unordered_map< rtl::OUString, NSString*, rtl::OUStringHash > OfficeOnlyTypes; + mutable OfficeOnlyTypes maOfficeOnlyTypes; }; typedef boost::shared_ptr DataFlavorMapperPtr_t; -- cgit v1.2.3