summaryrefslogtreecommitdiff
path: root/vcl/aqua
diff options
context:
space:
mode:
authorHerbert Dürr <hdu@apache.org>2012-05-14 15:10:16 +0000
committerTor Lillqvist <tml@iki.fi>2013-03-26 14:52:09 +0200
commit9fccdcaf810e543e28bca662300b5936ad7acf30 (patch)
treecd6788125aef3c0f04c4428f0e760e62d086f0e2 /vcl/aqua
parentffb837eed2c6f843f12f9368ed2183660a0036a1 (diff)
(author=pl) fix for transporting OOo types through OSX system clipboard
Change-Id: Idc00fbc8ac1adb04c76ecb4b641cfa055f5901b8
Diffstat (limited to 'vcl/aqua')
-rw-r--r--vcl/aqua/source/dtrans/DataFlavorMapping.cxx60
-rw-r--r--vcl/aqua/source/dtrans/DataFlavorMapping.hxx4
2 files changed, 58 insertions, 6 deletions
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<sal_Int8>*)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<sal_Int8>*)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 <Cocoa/Cocoa.h>
#include <postmac.h>
+#include <boost/unordered_map.hpp>
#include <memory>
#include <boost/shared_ptr.hpp>
@@ -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<DataFlavorMapper> DataFlavorMapperPtr_t;