[Libreoffice-commits] core.git: vcl/aqua

Herbert Dürr hdu at apache.org
Tue Mar 26 05:52:52 PDT 2013


 vcl/aqua/source/dtrans/DataFlavorMapping.cxx |   60 ++++++++++++++++++++++++---
 vcl/aqua/source/dtrans/DataFlavorMapping.hxx |    4 +
 2 files changed, 58 insertions(+), 6 deletions(-)

New commits:
commit 9fccdcaf810e543e28bca662300b5936ad7acf30
Author: Herbert Dürr <hdu at apache.org>
Date:   Mon May 14 15:10:16 2012 +0000

    (author=pl) fix for transporting OOo types through OSX system clipboard
    
    Change-Id: Idc00fbc8ac1adb04c76ecb4b641cfa055f5901b8

diff --git a/vcl/aqua/source/dtrans/DataFlavorMapping.cxx b/vcl/aqua/source/dtrans/DataFlavorMapping.cxx
index 23dbfd4..b030ac8 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 3efe8cf..7ef3640 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;


More information about the Libreoffice-commits mailing list