1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir #include "vcl/unohelp.hxx" 29*cdf0e10cSrcweir #include <DataFlavorMapping.hxx> 30*cdf0e10cSrcweir #include "HtmlFmtFlt.hxx" 31*cdf0e10cSrcweir #include "PictToBmpFlt.hxx" 32*cdf0e10cSrcweir #include "com/sun/star/datatransfer/UnsupportedFlavorException.hpp" 33*cdf0e10cSrcweir #include "com/sun/star/datatransfer/XMimeContentType.hpp" 34*cdf0e10cSrcweir #include "com/sun/star/lang/XMultiServiceFactory.hpp" 35*cdf0e10cSrcweir #include "com/sun/star/uno/Sequence.hxx" 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #include <rtl/ustring.hxx> 38*cdf0e10cSrcweir #include <rtl/memory.h> 39*cdf0e10cSrcweir #include <osl/endian.h> 40*cdf0e10cSrcweir 41*cdf0e10cSrcweir #include <vector> 42*cdf0e10cSrcweir #include <stdio.h> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir #include <premac.h> 45*cdf0e10cSrcweir #include <Cocoa/Cocoa.h> 46*cdf0e10cSrcweir #include <postmac.h> 47*cdf0e10cSrcweir 48*cdf0e10cSrcweir using namespace ::com::sun::star::datatransfer; 49*cdf0e10cSrcweir using namespace rtl; 50*cdf0e10cSrcweir using namespace ::com::sun::star::uno; 51*cdf0e10cSrcweir using namespace com::sun::star::lang; 52*cdf0e10cSrcweir using namespace cppu; 53*cdf0e10cSrcweir using namespace std; 54*cdf0e10cSrcweir 55*cdf0e10cSrcweir namespace // private 56*cdf0e10cSrcweir { 57*cdf0e10cSrcweir const Type CPPUTYPE_SEQINT8 = getCppuType((Sequence<sal_Int8>*)0); 58*cdf0e10cSrcweir const Type CPPUTYPE_OUSTRING = getCppuType( (OUString*)0 ); 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir /* Determine whether or not a DataFlavor is valid. 61*cdf0e10cSrcweir */ 62*cdf0e10cSrcweir bool isValidFlavor(const DataFlavor& aFlavor) 63*cdf0e10cSrcweir { 64*cdf0e10cSrcweir size_t len = aFlavor.MimeType.getLength(); 65*cdf0e10cSrcweir Type dtype = aFlavor.DataType; 66*cdf0e10cSrcweir return ((len > 0) && ((dtype == CPPUTYPE_SEQINT8) || (dtype == CPPUTYPE_OUSTRING))); 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir typedef vector<sal_Unicode> UnicodeBuffer; 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir OUString NSStringToOUString(NSString* cfString) 72*cdf0e10cSrcweir { 73*cdf0e10cSrcweir BOOST_ASSERT(cfString && "Invalid parameter"); 74*cdf0e10cSrcweir 75*cdf0e10cSrcweir const char* utf8Str = [cfString UTF8String]; 76*cdf0e10cSrcweir unsigned int len = rtl_str_getLength(utf8Str); 77*cdf0e10cSrcweir 78*cdf0e10cSrcweir return OUString(utf8Str, len, RTL_TEXTENCODING_UTF8); 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir NSString* OUStringToNSString(const OUString& ustring) 82*cdf0e10cSrcweir { 83*cdf0e10cSrcweir OString utf8Str = OUStringToOString(ustring, RTL_TEXTENCODING_UTF8); 84*cdf0e10cSrcweir return [NSString stringWithCString: utf8Str.getStr() encoding: NSUTF8StringEncoding]; 85*cdf0e10cSrcweir } 86*cdf0e10cSrcweir 87*cdf0e10cSrcweir 88*cdf0e10cSrcweir const NSString* PBTYPE_UT16 = @"CorePasteboardFlavorType 0x75743136"; 89*cdf0e10cSrcweir const NSString* PBTYPE_PICT = @"CorePasteboardFlavorType 0x50494354"; 90*cdf0e10cSrcweir const NSString* PBTYPE_HTML = @"CorePasteboardFlavorType 0x48544D4C"; 91*cdf0e10cSrcweir const NSString* PBTYPE_SODX = @"application/x-openoffice-objectdescriptor-xml;windows_formatname=\"Star Object Descriptor (XML)\""; 92*cdf0e10cSrcweir const NSString* PBTYPE_SESX = @"application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""; 93*cdf0e10cSrcweir const NSString* PBTYPE_SLSDX = @"application/x-openoffice-linksrcdescriptor-xml;windows_formatname=\"Star Link Source Descriptor (XML)\""; 94*cdf0e10cSrcweir const NSString* PBTYPE_ESX = @"application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""; 95*cdf0e10cSrcweir const NSString* PBTYPE_LSX = @"application/x-openoffice-link-source-xml;windows_formatname=\"Star Link Source (XML)\""; 96*cdf0e10cSrcweir const NSString* PBTYPE_EOX = @"application/x-openoffice-embedded-obj-xml;windows_formatname=\"Star Embedded Object (XML)\""; 97*cdf0e10cSrcweir const NSString* PBTYPE_SVXB = @"application/x-openoffice-svbx;windows_formatname=\"SVXB (StarView Bitmap/Animation)\""; 98*cdf0e10cSrcweir const NSString* PBTYPE_GDIMF = @"application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\""; 99*cdf0e10cSrcweir const NSString* PBTYPE_WMF = @"application/x-openoffice-wmf;windows_formatname=\"Image WMF\""; 100*cdf0e10cSrcweir const NSString* PBTYPE_EMF = @"application/x-openoffice-emf;windows_formatname=\"Image EMF\""; 101*cdf0e10cSrcweir 102*cdf0e10cSrcweir const NSString* PBTYPE_DUMMY_INTERNAL = @"application/x-openoffice-internal"; 103*cdf0e10cSrcweir 104*cdf0e10cSrcweir const char* FLAVOR_SODX = "application/x-openoffice-objectdescriptor-xml;windows_formatname=\"Star Object Descriptor (XML)\""; 105*cdf0e10cSrcweir const char* FLAVOR_SESX = "application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""; 106*cdf0e10cSrcweir const char* FLAVOR_SLSDX = "application/x-openoffice-linksrcdescriptor-xml;windows_formatname=\"Star Link Source Descriptor (XML)\""; 107*cdf0e10cSrcweir const char* FLAVOR_ESX = "application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""; 108*cdf0e10cSrcweir const char* FLAVOR_LSX = "application/x-openoffice-link-source-xml;windows_formatname=\"Star Link Source (XML)\""; 109*cdf0e10cSrcweir const char* FLAVOR_EOX = "application/x-openoffice-embedded-obj-xml;windows_formatname=\"Star Embedded Object (XML)\""; 110*cdf0e10cSrcweir const char* FLAVOR_SVXB = "application/x-openoffice-svbx;windows_formatname=\"SVXB (StarView Bitmap/Animation)\""; 111*cdf0e10cSrcweir const char* FLAVOR_GDIMF = "application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\""; 112*cdf0e10cSrcweir const char* FLAVOR_WMF = "application/x-openoffice-wmf;windows_formatname=\"Image WMF\""; 113*cdf0e10cSrcweir const char* FLAVOR_EMF = "application/x-openoffice-emf;windows_formatname=\"Image EMF\""; 114*cdf0e10cSrcweir 115*cdf0e10cSrcweir const char* FLAVOR_DUMMY_INTERNAL = "application/x-openoffice-internal"; 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir 118*cdf0e10cSrcweir struct FlavorMap 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir NSString* SystemFlavor; 121*cdf0e10cSrcweir const char* OOoFlavor; 122*cdf0e10cSrcweir const char* HumanPresentableName; 123*cdf0e10cSrcweir Type DataType; 124*cdf0e10cSrcweir }; 125*cdf0e10cSrcweir 126*cdf0e10cSrcweir /* At the moment it appears as if only MS Office pastes "public.html" to the clipboard. 127*cdf0e10cSrcweir */ 128*cdf0e10cSrcweir FlavorMap flavorMap[] = 129*cdf0e10cSrcweir { 130*cdf0e10cSrcweir { NSStringPboardType, "text/plain;charset=utf-16", "Unicode Text (UTF-16)", CPPUTYPE_OUSTRING }, 131*cdf0e10cSrcweir { NSRTFPboardType, "text/richtext", "Rich Text Format", CPPUTYPE_SEQINT8 }, 132*cdf0e10cSrcweir { NSTIFFPboardType, "image/bmp", "Windows Bitmap", CPPUTYPE_SEQINT8 }, 133*cdf0e10cSrcweir { NSPICTPboardType, "image/bmp", "Windows Bitmap", CPPUTYPE_SEQINT8 }, 134*cdf0e10cSrcweir { NSHTMLPboardType, "text/html", "Plain Html", CPPUTYPE_SEQINT8 }, 135*cdf0e10cSrcweir { NSFilenamesPboardType, "application/x-openoffice-filelist;windows_formatname=\"FileList\"", "FileList", CPPUTYPE_SEQINT8 }, 136*cdf0e10cSrcweir { PBTYPE_SESX, FLAVOR_SESX, "Star Embed Source (XML)", CPPUTYPE_SEQINT8 }, 137*cdf0e10cSrcweir { PBTYPE_SLSDX, FLAVOR_SLSDX, "Star Link Source Descriptor (XML)", CPPUTYPE_SEQINT8 }, 138*cdf0e10cSrcweir { PBTYPE_ESX, FLAVOR_ESX, "Star Embed Source (XML)", CPPUTYPE_SEQINT8 }, 139*cdf0e10cSrcweir { PBTYPE_LSX, FLAVOR_LSX, "Star Link Source (XML)", CPPUTYPE_SEQINT8 }, 140*cdf0e10cSrcweir { PBTYPE_EOX, FLAVOR_EOX, "Star Embedded Object (XML)", CPPUTYPE_SEQINT8 }, 141*cdf0e10cSrcweir { PBTYPE_SVXB, FLAVOR_SVXB, "SVXB (StarView Bitmap/Animation", CPPUTYPE_SEQINT8 }, 142*cdf0e10cSrcweir { PBTYPE_GDIMF, FLAVOR_GDIMF, "GDIMetaFile", CPPUTYPE_SEQINT8 }, 143*cdf0e10cSrcweir { PBTYPE_WMF, FLAVOR_WMF, "Windows MetaFile", CPPUTYPE_SEQINT8 }, 144*cdf0e10cSrcweir { PBTYPE_EMF, FLAVOR_EMF, "Windows Enhanced MetaFile", CPPUTYPE_SEQINT8 }, 145*cdf0e10cSrcweir { PBTYPE_SODX, FLAVOR_SODX, "Star Object Descriptor (XML)", CPPUTYPE_SEQINT8 }, 146*cdf0e10cSrcweir { PBTYPE_DUMMY_INTERNAL, FLAVOR_DUMMY_INTERNAL, "internal data",CPPUTYPE_SEQINT8 } 147*cdf0e10cSrcweir }; 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir 150*cdf0e10cSrcweir #define SIZE_FLAVOR_MAP (sizeof(flavorMap)/sizeof(FlavorMap)) 151*cdf0e10cSrcweir 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir inline bool isByteSequenceType(const Type& theType) 154*cdf0e10cSrcweir { 155*cdf0e10cSrcweir return (theType == CPPUTYPE_SEQINT8); 156*cdf0e10cSrcweir } 157*cdf0e10cSrcweir 158*cdf0e10cSrcweir inline bool isOUStringType(const Type& theType) 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir return (theType == CPPUTYPE_OUSTRING); 161*cdf0e10cSrcweir } 162*cdf0e10cSrcweir 163*cdf0e10cSrcweir } // namespace private 164*cdf0e10cSrcweir 165*cdf0e10cSrcweir 166*cdf0e10cSrcweir //########################### 167*cdf0e10cSrcweir 168*cdf0e10cSrcweir /* A base class for other data provider. 169*cdf0e10cSrcweir */ 170*cdf0e10cSrcweir class DataProviderBaseImpl : public DataProvider 171*cdf0e10cSrcweir { 172*cdf0e10cSrcweir public: 173*cdf0e10cSrcweir DataProviderBaseImpl(const Any& data); 174*cdf0e10cSrcweir DataProviderBaseImpl(id data); 175*cdf0e10cSrcweir virtual ~DataProviderBaseImpl(); 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir protected: 178*cdf0e10cSrcweir Any mData; 179*cdf0e10cSrcweir //NSData* mSystemData; 180*cdf0e10cSrcweir id mSystemData; 181*cdf0e10cSrcweir }; 182*cdf0e10cSrcweir 183*cdf0e10cSrcweir DataProviderBaseImpl::DataProviderBaseImpl(const Any& data) : 184*cdf0e10cSrcweir mData(data), 185*cdf0e10cSrcweir mSystemData(nil) 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir } 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir DataProviderBaseImpl::DataProviderBaseImpl(id data) : 190*cdf0e10cSrcweir mSystemData(data) 191*cdf0e10cSrcweir { 192*cdf0e10cSrcweir [mSystemData retain]; 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir 195*cdf0e10cSrcweir 196*cdf0e10cSrcweir DataProviderBaseImpl::~DataProviderBaseImpl() 197*cdf0e10cSrcweir { 198*cdf0e10cSrcweir if (mSystemData) 199*cdf0e10cSrcweir { 200*cdf0e10cSrcweir [mSystemData release]; 201*cdf0e10cSrcweir } 202*cdf0e10cSrcweir } 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir //################################# 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir class UniDataProvider : public DataProviderBaseImpl 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir public: 209*cdf0e10cSrcweir UniDataProvider(const Any& data); 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir UniDataProvider(NSData* data); 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir virtual NSData* getSystemData(); 214*cdf0e10cSrcweir 215*cdf0e10cSrcweir virtual Any getOOoData(); 216*cdf0e10cSrcweir }; 217*cdf0e10cSrcweir 218*cdf0e10cSrcweir UniDataProvider::UniDataProvider(const Any& data) : 219*cdf0e10cSrcweir DataProviderBaseImpl(data) 220*cdf0e10cSrcweir { 221*cdf0e10cSrcweir } 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir UniDataProvider::UniDataProvider(NSData* data) : 224*cdf0e10cSrcweir DataProviderBaseImpl(data) 225*cdf0e10cSrcweir { 226*cdf0e10cSrcweir } 227*cdf0e10cSrcweir 228*cdf0e10cSrcweir NSData* UniDataProvider::getSystemData() 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir OUString ustr; 231*cdf0e10cSrcweir mData >>= ustr; 232*cdf0e10cSrcweir 233*cdf0e10cSrcweir OString strUtf8; 234*cdf0e10cSrcweir ustr.convertToString(&strUtf8, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS); 235*cdf0e10cSrcweir 236*cdf0e10cSrcweir return [NSData dataWithBytes: strUtf8.getStr() length: strUtf8.getLength()]; 237*cdf0e10cSrcweir } 238*cdf0e10cSrcweir 239*cdf0e10cSrcweir Any UniDataProvider::getOOoData() 240*cdf0e10cSrcweir { 241*cdf0e10cSrcweir Any oOOData; 242*cdf0e10cSrcweir 243*cdf0e10cSrcweir if (mSystemData) 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir oOOData = makeAny(OUString(reinterpret_cast<const sal_Char*>([mSystemData bytes]), 246*cdf0e10cSrcweir [mSystemData length], 247*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8)); 248*cdf0e10cSrcweir } 249*cdf0e10cSrcweir else 250*cdf0e10cSrcweir { 251*cdf0e10cSrcweir oOOData = mData; 252*cdf0e10cSrcweir } 253*cdf0e10cSrcweir 254*cdf0e10cSrcweir return oOOData; 255*cdf0e10cSrcweir } 256*cdf0e10cSrcweir 257*cdf0e10cSrcweir //########################### 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir class ByteSequenceDataProvider : public DataProviderBaseImpl 260*cdf0e10cSrcweir { 261*cdf0e10cSrcweir public: 262*cdf0e10cSrcweir ByteSequenceDataProvider(const Any& data); 263*cdf0e10cSrcweir 264*cdf0e10cSrcweir ByteSequenceDataProvider(NSData* data); 265*cdf0e10cSrcweir 266*cdf0e10cSrcweir virtual NSData* getSystemData(); 267*cdf0e10cSrcweir 268*cdf0e10cSrcweir virtual Any getOOoData(); 269*cdf0e10cSrcweir }; 270*cdf0e10cSrcweir 271*cdf0e10cSrcweir ByteSequenceDataProvider::ByteSequenceDataProvider(const Any& data) : 272*cdf0e10cSrcweir DataProviderBaseImpl(data) 273*cdf0e10cSrcweir { 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir 276*cdf0e10cSrcweir ByteSequenceDataProvider::ByteSequenceDataProvider(NSData* data) : 277*cdf0e10cSrcweir DataProviderBaseImpl(data) 278*cdf0e10cSrcweir { 279*cdf0e10cSrcweir } 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir 282*cdf0e10cSrcweir NSData* ByteSequenceDataProvider::getSystemData() 283*cdf0e10cSrcweir { 284*cdf0e10cSrcweir Sequence<sal_Int8> rawData; 285*cdf0e10cSrcweir mData >>= rawData; 286*cdf0e10cSrcweir 287*cdf0e10cSrcweir return [NSData dataWithBytes: rawData.getArray() length: rawData.getLength()]; 288*cdf0e10cSrcweir } 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir Any ByteSequenceDataProvider::getOOoData() 291*cdf0e10cSrcweir { 292*cdf0e10cSrcweir Any oOOData; 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir if (mSystemData) 295*cdf0e10cSrcweir { 296*cdf0e10cSrcweir unsigned int flavorDataLength = [mSystemData length]; 297*cdf0e10cSrcweir Sequence<sal_Int8> byteSequence; 298*cdf0e10cSrcweir byteSequence.realloc(flavorDataLength); 299*cdf0e10cSrcweir memcpy(byteSequence.getArray(), [mSystemData bytes], flavorDataLength); 300*cdf0e10cSrcweir oOOData = makeAny(byteSequence); 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir else 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir oOOData = mData; 305*cdf0e10cSrcweir } 306*cdf0e10cSrcweir 307*cdf0e10cSrcweir return oOOData; 308*cdf0e10cSrcweir } 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir //########################### 312*cdf0e10cSrcweir 313*cdf0e10cSrcweir class HTMLFormatDataProvider : public DataProviderBaseImpl 314*cdf0e10cSrcweir { 315*cdf0e10cSrcweir public: 316*cdf0e10cSrcweir HTMLFormatDataProvider(const Any& data); 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir HTMLFormatDataProvider(NSData* data); 319*cdf0e10cSrcweir 320*cdf0e10cSrcweir virtual NSData* getSystemData(); 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir virtual Any getOOoData(); 323*cdf0e10cSrcweir }; 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir HTMLFormatDataProvider::HTMLFormatDataProvider(const Any& data) : 326*cdf0e10cSrcweir DataProviderBaseImpl(data) 327*cdf0e10cSrcweir { 328*cdf0e10cSrcweir } 329*cdf0e10cSrcweir 330*cdf0e10cSrcweir HTMLFormatDataProvider::HTMLFormatDataProvider(NSData* data) : 331*cdf0e10cSrcweir DataProviderBaseImpl(data) 332*cdf0e10cSrcweir { 333*cdf0e10cSrcweir } 334*cdf0e10cSrcweir 335*cdf0e10cSrcweir NSData* HTMLFormatDataProvider::getSystemData() 336*cdf0e10cSrcweir { 337*cdf0e10cSrcweir Sequence<sal_Int8> textHtmlData; 338*cdf0e10cSrcweir mData >>= textHtmlData; 339*cdf0e10cSrcweir 340*cdf0e10cSrcweir Sequence<sal_Int8> htmlFormatData = TextHtmlToHTMLFormat(textHtmlData); 341*cdf0e10cSrcweir 342*cdf0e10cSrcweir return [NSData dataWithBytes: htmlFormatData.getArray() length: htmlFormatData.getLength()]; 343*cdf0e10cSrcweir } 344*cdf0e10cSrcweir 345*cdf0e10cSrcweir Any HTMLFormatDataProvider::getOOoData() 346*cdf0e10cSrcweir { 347*cdf0e10cSrcweir Any oOOData; 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir if (mSystemData) 350*cdf0e10cSrcweir { 351*cdf0e10cSrcweir unsigned int flavorDataLength = [mSystemData length]; 352*cdf0e10cSrcweir Sequence<sal_Int8> unkHtmlData; 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir unkHtmlData.realloc(flavorDataLength); 355*cdf0e10cSrcweir memcpy(unkHtmlData.getArray(), [mSystemData bytes], flavorDataLength); 356*cdf0e10cSrcweir 357*cdf0e10cSrcweir Sequence<sal_Int8>* pPlainHtml = &unkHtmlData; 358*cdf0e10cSrcweir Sequence<sal_Int8> plainHtml; 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir if (isHTMLFormat(unkHtmlData)) 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir plainHtml = HTMLFormatToTextHtml(unkHtmlData); 363*cdf0e10cSrcweir pPlainHtml = &plainHtml; 364*cdf0e10cSrcweir } 365*cdf0e10cSrcweir 366*cdf0e10cSrcweir oOOData = makeAny(*pPlainHtml); 367*cdf0e10cSrcweir } 368*cdf0e10cSrcweir else 369*cdf0e10cSrcweir { 370*cdf0e10cSrcweir oOOData = mData; 371*cdf0e10cSrcweir } 372*cdf0e10cSrcweir 373*cdf0e10cSrcweir return oOOData; 374*cdf0e10cSrcweir } 375*cdf0e10cSrcweir 376*cdf0e10cSrcweir //########################### 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir class BMPDataProvider : public DataProviderBaseImpl 379*cdf0e10cSrcweir { 380*cdf0e10cSrcweir NSBitmapImageFileType meImageType; 381*cdf0e10cSrcweir public: 382*cdf0e10cSrcweir BMPDataProvider(const Any& data, NSBitmapImageFileType eImageType ); 383*cdf0e10cSrcweir 384*cdf0e10cSrcweir BMPDataProvider(NSData* data, NSBitmapImageFileType eImageType); 385*cdf0e10cSrcweir 386*cdf0e10cSrcweir virtual NSData* getSystemData(); 387*cdf0e10cSrcweir 388*cdf0e10cSrcweir virtual Any getOOoData(); 389*cdf0e10cSrcweir }; 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir BMPDataProvider::BMPDataProvider(const Any& data, NSBitmapImageFileType eImageType) : 392*cdf0e10cSrcweir DataProviderBaseImpl(data), 393*cdf0e10cSrcweir meImageType( eImageType ) 394*cdf0e10cSrcweir { 395*cdf0e10cSrcweir } 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir BMPDataProvider::BMPDataProvider(NSData* data, NSBitmapImageFileType eImageType) : 398*cdf0e10cSrcweir DataProviderBaseImpl(data), 399*cdf0e10cSrcweir meImageType( eImageType ) 400*cdf0e10cSrcweir { 401*cdf0e10cSrcweir } 402*cdf0e10cSrcweir 403*cdf0e10cSrcweir NSData* BMPDataProvider::getSystemData() 404*cdf0e10cSrcweir { 405*cdf0e10cSrcweir Sequence<sal_Int8> bmpData; 406*cdf0e10cSrcweir mData >>= bmpData; 407*cdf0e10cSrcweir 408*cdf0e10cSrcweir Sequence<sal_Int8> pictData; 409*cdf0e10cSrcweir NSData* sysData = NULL; 410*cdf0e10cSrcweir 411*cdf0e10cSrcweir if (BMPToImage(bmpData, pictData, meImageType)) 412*cdf0e10cSrcweir { 413*cdf0e10cSrcweir sysData = [NSData dataWithBytes: pictData.getArray() length: pictData.getLength()]; 414*cdf0e10cSrcweir } 415*cdf0e10cSrcweir 416*cdf0e10cSrcweir return sysData; 417*cdf0e10cSrcweir } 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir /* At the moment the OOo 'PCT' filter is not good enough to be used 420*cdf0e10cSrcweir and there is no flavor defined for exchanging 'PCT' with OOo so 421*cdf0e10cSrcweir we will at the moment convert 'PCT' to a Windows BMP and provide 422*cdf0e10cSrcweir this to OOo 423*cdf0e10cSrcweir */ 424*cdf0e10cSrcweir Any BMPDataProvider::getOOoData() 425*cdf0e10cSrcweir { 426*cdf0e10cSrcweir Any oOOData; 427*cdf0e10cSrcweir 428*cdf0e10cSrcweir if (mSystemData) 429*cdf0e10cSrcweir { 430*cdf0e10cSrcweir unsigned int flavorDataLength = [mSystemData length]; 431*cdf0e10cSrcweir Sequence<sal_Int8> pictData(flavorDataLength); 432*cdf0e10cSrcweir 433*cdf0e10cSrcweir memcpy(pictData.getArray(), [mSystemData bytes], flavorDataLength); 434*cdf0e10cSrcweir 435*cdf0e10cSrcweir Sequence<sal_Int8> bmpData; 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir if (ImageToBMP(pictData, bmpData, meImageType)) 438*cdf0e10cSrcweir { 439*cdf0e10cSrcweir oOOData = makeAny(bmpData); 440*cdf0e10cSrcweir } 441*cdf0e10cSrcweir } 442*cdf0e10cSrcweir else 443*cdf0e10cSrcweir { 444*cdf0e10cSrcweir oOOData = mData; 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir return oOOData; 448*cdf0e10cSrcweir } 449*cdf0e10cSrcweir 450*cdf0e10cSrcweir //###################### 451*cdf0e10cSrcweir 452*cdf0e10cSrcweir class FileListDataProvider : public DataProviderBaseImpl 453*cdf0e10cSrcweir { 454*cdf0e10cSrcweir public: 455*cdf0e10cSrcweir FileListDataProvider(const Any& data); 456*cdf0e10cSrcweir FileListDataProvider(NSArray* data); 457*cdf0e10cSrcweir 458*cdf0e10cSrcweir virtual NSData* getSystemData(); 459*cdf0e10cSrcweir virtual Any getOOoData(); 460*cdf0e10cSrcweir }; 461*cdf0e10cSrcweir 462*cdf0e10cSrcweir FileListDataProvider::FileListDataProvider(const Any& data) : 463*cdf0e10cSrcweir DataProviderBaseImpl(data) 464*cdf0e10cSrcweir { 465*cdf0e10cSrcweir } 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir FileListDataProvider::FileListDataProvider(NSArray* data) : 468*cdf0e10cSrcweir DataProviderBaseImpl(data) 469*cdf0e10cSrcweir { 470*cdf0e10cSrcweir } 471*cdf0e10cSrcweir 472*cdf0e10cSrcweir NSData* FileListDataProvider::getSystemData() 473*cdf0e10cSrcweir { 474*cdf0e10cSrcweir return [NSData data]; 475*cdf0e10cSrcweir } 476*cdf0e10cSrcweir 477*cdf0e10cSrcweir Any FileListDataProvider::getOOoData() 478*cdf0e10cSrcweir { 479*cdf0e10cSrcweir Any oOOData; 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir if (mSystemData) 482*cdf0e10cSrcweir { 483*cdf0e10cSrcweir size_t length = [mSystemData count]; 484*cdf0e10cSrcweir size_t lenSeqRequired = 0; 485*cdf0e10cSrcweir 486*cdf0e10cSrcweir for (size_t i = 0; i < length; i++) 487*cdf0e10cSrcweir { 488*cdf0e10cSrcweir NSString* fname = [mSystemData objectAtIndex: i]; 489*cdf0e10cSrcweir lenSeqRequired += [fname maximumLengthOfBytesUsingEncoding: NSUnicodeStringEncoding] + sizeof(unichar); 490*cdf0e10cSrcweir } 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir Sequence<sal_Int8> oOOFileList(lenSeqRequired); 493*cdf0e10cSrcweir unichar* pBuffer = reinterpret_cast<unichar*>(oOOFileList.getArray()); 494*cdf0e10cSrcweir rtl_zeroMemory(pBuffer, lenSeqRequired); 495*cdf0e10cSrcweir 496*cdf0e10cSrcweir for (size_t i = 0; i < length; i++) 497*cdf0e10cSrcweir { 498*cdf0e10cSrcweir NSString* fname = [mSystemData objectAtIndex: i]; 499*cdf0e10cSrcweir [fname getCharacters: pBuffer]; 500*cdf0e10cSrcweir size_t l = [fname length]; 501*cdf0e10cSrcweir pBuffer += l + 1; 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir 504*cdf0e10cSrcweir oOOData = makeAny(oOOFileList); 505*cdf0e10cSrcweir } 506*cdf0e10cSrcweir else 507*cdf0e10cSrcweir { 508*cdf0e10cSrcweir oOOData = mData; 509*cdf0e10cSrcweir } 510*cdf0e10cSrcweir 511*cdf0e10cSrcweir return oOOData; 512*cdf0e10cSrcweir } 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir //########################### 515*cdf0e10cSrcweir 516*cdf0e10cSrcweir DataFlavorMapper::DataFlavorMapper() 517*cdf0e10cSrcweir { 518*cdf0e10cSrcweir Reference<XMultiServiceFactory> mrServiceManager = vcl::unohelper::GetMultiServiceFactory(); 519*cdf0e10cSrcweir mrXMimeCntFactory = Reference<XMimeContentTypeFactory>(mrServiceManager->createInstance( 520*cdf0e10cSrcweir OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.MimeContentTypeFactory"))), UNO_QUERY); 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir if (!mrXMimeCntFactory.is()) 523*cdf0e10cSrcweir throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("AquaClipboard: Cannot create com.sun.star.datatransfer.MimeContentTypeFactory")), NULL); 524*cdf0e10cSrcweir } 525*cdf0e10cSrcweir 526*cdf0e10cSrcweir DataFlavor DataFlavorMapper::systemToOpenOfficeFlavor(NSString* systemDataFlavor) const 527*cdf0e10cSrcweir { 528*cdf0e10cSrcweir DataFlavor oOOFlavor; 529*cdf0e10cSrcweir 530*cdf0e10cSrcweir for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++) 531*cdf0e10cSrcweir { 532*cdf0e10cSrcweir if ([systemDataFlavor caseInsensitiveCompare: flavorMap[i].SystemFlavor] == NSOrderedSame) 533*cdf0e10cSrcweir { 534*cdf0e10cSrcweir oOOFlavor.MimeType = OUString::createFromAscii(flavorMap[i].OOoFlavor); 535*cdf0e10cSrcweir oOOFlavor.HumanPresentableName = OUString(RTL_CONSTASCII_USTRINGPARAM(flavorMap[i].HumanPresentableName)); 536*cdf0e10cSrcweir oOOFlavor.DataType = flavorMap[i].DataType; 537*cdf0e10cSrcweir return oOOFlavor; 538*cdf0e10cSrcweir } 539*cdf0e10cSrcweir } // for 540*cdf0e10cSrcweir 541*cdf0e10cSrcweir return oOOFlavor; 542*cdf0e10cSrcweir } 543*cdf0e10cSrcweir 544*cdf0e10cSrcweir NSString* DataFlavorMapper::openOfficeToSystemFlavor(const DataFlavor& oOOFlavor) const 545*cdf0e10cSrcweir { 546*cdf0e10cSrcweir NSString* sysFlavor = NULL; 547*cdf0e10cSrcweir 548*cdf0e10cSrcweir for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++) 549*cdf0e10cSrcweir { 550*cdf0e10cSrcweir if (oOOFlavor.MimeType.compareToAscii(flavorMap[i].OOoFlavor, strlen(flavorMap[i].OOoFlavor)) == 0) 551*cdf0e10cSrcweir { 552*cdf0e10cSrcweir sysFlavor = flavorMap[i].SystemFlavor; 553*cdf0e10cSrcweir } 554*cdf0e10cSrcweir } 555*cdf0e10cSrcweir 556*cdf0e10cSrcweir return sysFlavor; 557*cdf0e10cSrcweir } 558*cdf0e10cSrcweir 559*cdf0e10cSrcweir NSString* DataFlavorMapper::openOfficeImageToSystemFlavor(NSPasteboard* pPasteboard) const 560*cdf0e10cSrcweir { 561*cdf0e10cSrcweir NSArray *supportedTypes = [NSArray arrayWithObjects: NSTIFFPboardType, NSPICTPboardType, nil]; 562*cdf0e10cSrcweir NSString *sysFlavor = [pPasteboard availableTypeFromArray:supportedTypes]; 563*cdf0e10cSrcweir return sysFlavor; 564*cdf0e10cSrcweir } 565*cdf0e10cSrcweir 566*cdf0e10cSrcweir DataProviderPtr_t DataFlavorMapper::getDataProvider(NSString* systemFlavor, Reference<XTransferable> rTransferable) const 567*cdf0e10cSrcweir { 568*cdf0e10cSrcweir DataProviderPtr_t dp; 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir try 571*cdf0e10cSrcweir { 572*cdf0e10cSrcweir DataFlavor oOOFlavor = systemToOpenOfficeFlavor(systemFlavor); 573*cdf0e10cSrcweir 574*cdf0e10cSrcweir Any data = rTransferable->getTransferData(oOOFlavor); 575*cdf0e10cSrcweir 576*cdf0e10cSrcweir if (isByteSequenceType(data.getValueType())) 577*cdf0e10cSrcweir { 578*cdf0e10cSrcweir /* 579*cdf0e10cSrcweir the HTMLFormatDataProvider prepends segment information to HTML 580*cdf0e10cSrcweir this is useful for exchange with MS Word (which brings this stuff from Windows) 581*cdf0e10cSrcweir but annoying for other applications. Since this extension is not a standard datatype 582*cdf0e10cSrcweir on the Mac, let us not provide but provide normal HTML 583*cdf0e10cSrcweir 584*cdf0e10cSrcweir if ([systemFlavor caseInsensitiveCompare: NSHTMLPboardType] == NSOrderedSame) 585*cdf0e10cSrcweir { 586*cdf0e10cSrcweir dp = DataProviderPtr_t(new HTMLFormatDataProvider(data)); 587*cdf0e10cSrcweir } 588*cdf0e10cSrcweir else 589*cdf0e10cSrcweir */ 590*cdf0e10cSrcweir if ([systemFlavor caseInsensitiveCompare: NSPICTPboardType] == NSOrderedSame) 591*cdf0e10cSrcweir { 592*cdf0e10cSrcweir dp = DataProviderPtr_t(new BMPDataProvider(data, PICTImageFileType)); 593*cdf0e10cSrcweir } 594*cdf0e10cSrcweir else if ([systemFlavor caseInsensitiveCompare: NSTIFFPboardType] == NSOrderedSame) 595*cdf0e10cSrcweir { 596*cdf0e10cSrcweir dp = DataProviderPtr_t(new BMPDataProvider(data, NSTIFFFileType)); 597*cdf0e10cSrcweir } 598*cdf0e10cSrcweir else if ([systemFlavor caseInsensitiveCompare: NSFilenamesPboardType] == NSOrderedSame) 599*cdf0e10cSrcweir { 600*cdf0e10cSrcweir dp = DataProviderPtr_t(new FileListDataProvider(data)); 601*cdf0e10cSrcweir } 602*cdf0e10cSrcweir else 603*cdf0e10cSrcweir { 604*cdf0e10cSrcweir dp = DataProviderPtr_t(new ByteSequenceDataProvider(data)); 605*cdf0e10cSrcweir } 606*cdf0e10cSrcweir } 607*cdf0e10cSrcweir else // Must be OUString type 608*cdf0e10cSrcweir { 609*cdf0e10cSrcweir BOOST_ASSERT(isOUStringType(data.getValueType())); 610*cdf0e10cSrcweir dp = DataProviderPtr_t(new UniDataProvider(data)); 611*cdf0e10cSrcweir } 612*cdf0e10cSrcweir } 613*cdf0e10cSrcweir catch(UnsupportedFlavorException&) 614*cdf0e10cSrcweir { 615*cdf0e10cSrcweir // Somebody violates the contract of the clipboard 616*cdf0e10cSrcweir // interface @see XTransferable 617*cdf0e10cSrcweir } 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir return dp; 620*cdf0e10cSrcweir } 621*cdf0e10cSrcweir 622*cdf0e10cSrcweir DataProviderPtr_t DataFlavorMapper::getDataProvider(const NSString* /*systemFlavor*/, NSArray* systemData) const 623*cdf0e10cSrcweir { 624*cdf0e10cSrcweir return DataProviderPtr_t(new FileListDataProvider(systemData)); 625*cdf0e10cSrcweir } 626*cdf0e10cSrcweir 627*cdf0e10cSrcweir DataProviderPtr_t DataFlavorMapper::getDataProvider(const NSString* systemFlavor, NSData* systemData) const 628*cdf0e10cSrcweir { 629*cdf0e10cSrcweir DataProviderPtr_t dp; 630*cdf0e10cSrcweir 631*cdf0e10cSrcweir if ([systemFlavor caseInsensitiveCompare: NSStringPboardType] == NSOrderedSame) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir dp = DataProviderPtr_t(new UniDataProvider(systemData)); 634*cdf0e10cSrcweir } 635*cdf0e10cSrcweir else if ([systemFlavor caseInsensitiveCompare: NSHTMLPboardType] == NSOrderedSame) 636*cdf0e10cSrcweir { 637*cdf0e10cSrcweir dp = DataProviderPtr_t(new HTMLFormatDataProvider(systemData)); 638*cdf0e10cSrcweir } 639*cdf0e10cSrcweir else if ([systemFlavor caseInsensitiveCompare: NSPICTPboardType] == NSOrderedSame) 640*cdf0e10cSrcweir { 641*cdf0e10cSrcweir dp = DataProviderPtr_t(new BMPDataProvider(systemData, PICTImageFileType)); 642*cdf0e10cSrcweir } 643*cdf0e10cSrcweir else if ([systemFlavor caseInsensitiveCompare: NSTIFFPboardType] == NSOrderedSame) 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir dp = DataProviderPtr_t(new BMPDataProvider(systemData, NSTIFFFileType)); 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir else if ([systemFlavor caseInsensitiveCompare: NSFilenamesPboardType] == NSOrderedSame) 648*cdf0e10cSrcweir { 649*cdf0e10cSrcweir //dp = DataProviderPtr_t(new FileListDataProvider(systemData)); 650*cdf0e10cSrcweir } 651*cdf0e10cSrcweir else 652*cdf0e10cSrcweir { 653*cdf0e10cSrcweir dp = DataProviderPtr_t(new ByteSequenceDataProvider(systemData)); 654*cdf0e10cSrcweir } 655*cdf0e10cSrcweir 656*cdf0e10cSrcweir return dp; 657*cdf0e10cSrcweir } 658*cdf0e10cSrcweir 659*cdf0e10cSrcweir bool DataFlavorMapper::isValidMimeContentType(const rtl::OUString& contentType) const 660*cdf0e10cSrcweir { 661*cdf0e10cSrcweir bool result = true; 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir try 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir Reference<XMimeContentType> xCntType(mrXMimeCntFactory->createMimeContentType(contentType)); 666*cdf0e10cSrcweir } 667*cdf0e10cSrcweir catch( IllegalArgumentException& ) 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir result = false; 670*cdf0e10cSrcweir } 671*cdf0e10cSrcweir 672*cdf0e10cSrcweir return result; 673*cdf0e10cSrcweir } 674*cdf0e10cSrcweir 675*cdf0e10cSrcweir NSArray* DataFlavorMapper::flavorSequenceToTypesArray(const com::sun::star::uno::Sequence<com::sun::star::datatransfer::DataFlavor>& flavors) const 676*cdf0e10cSrcweir { 677*cdf0e10cSrcweir sal_uInt32 nFlavors = flavors.getLength(); 678*cdf0e10cSrcweir NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity: 1]; 679*cdf0e10cSrcweir 680*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < nFlavors; i++) 681*cdf0e10cSrcweir { 682*cdf0e10cSrcweir if( flavors[i].MimeType.compareToAscii( "image/bmp", 9 ) == 0 ) 683*cdf0e10cSrcweir { 684*cdf0e10cSrcweir [array addObject: NSTIFFPboardType]; 685*cdf0e10cSrcweir [array addObject: NSPICTPboardType]; 686*cdf0e10cSrcweir } 687*cdf0e10cSrcweir else 688*cdf0e10cSrcweir { 689*cdf0e10cSrcweir NSString* str = openOfficeToSystemFlavor(flavors[i]); 690*cdf0e10cSrcweir 691*cdf0e10cSrcweir if (str != NULL) 692*cdf0e10cSrcweir { 693*cdf0e10cSrcweir [array addObject: str]; 694*cdf0e10cSrcweir } 695*cdf0e10cSrcweir } 696*cdf0e10cSrcweir } 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir // #i89462# #i90747# 699*cdf0e10cSrcweir // in case no system flavor was found to report 700*cdf0e10cSrcweir // report at least one so D&D between OOo targets works 701*cdf0e10cSrcweir if( [array count] == 0 ) 702*cdf0e10cSrcweir { 703*cdf0e10cSrcweir [array addObject: PBTYPE_DUMMY_INTERNAL]; 704*cdf0e10cSrcweir } 705*cdf0e10cSrcweir 706*cdf0e10cSrcweir return [array autorelease]; 707*cdf0e10cSrcweir } 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir com::sun::star::uno::Sequence<com::sun::star::datatransfer::DataFlavor> DataFlavorMapper::typesArrayToFlavorSequence(NSArray* types) const 710*cdf0e10cSrcweir { 711*cdf0e10cSrcweir int nFormats = [types count]; 712*cdf0e10cSrcweir Sequence<DataFlavor> flavors; 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir for (int i = 0; i < nFormats; i++) 715*cdf0e10cSrcweir { 716*cdf0e10cSrcweir NSString* sysFormat = [types objectAtIndex: i]; 717*cdf0e10cSrcweir DataFlavor oOOFlavor = systemToOpenOfficeFlavor(sysFormat); 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir if (isValidFlavor(oOOFlavor)) 720*cdf0e10cSrcweir { 721*cdf0e10cSrcweir flavors.realloc(flavors.getLength() + 1); 722*cdf0e10cSrcweir flavors[flavors.getLength() - 1] = oOOFlavor; 723*cdf0e10cSrcweir } 724*cdf0e10cSrcweir } 725*cdf0e10cSrcweir 726*cdf0e10cSrcweir return flavors; 727*cdf0e10cSrcweir } 728*cdf0e10cSrcweir 729*cdf0e10cSrcweir 730*cdf0e10cSrcweir NSArray* DataFlavorMapper::getAllSupportedPboardTypes() const 731*cdf0e10cSrcweir { 732*cdf0e10cSrcweir NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity: SIZE_FLAVOR_MAP]; 733*cdf0e10cSrcweir 734*cdf0e10cSrcweir for (sal_uInt32 i = 0; i < SIZE_FLAVOR_MAP; i++) 735*cdf0e10cSrcweir { 736*cdf0e10cSrcweir [array addObject: flavorMap[i].SystemFlavor]; 737*cdf0e10cSrcweir } 738*cdf0e10cSrcweir 739*cdf0e10cSrcweir return [array autorelease]; 740*cdf0e10cSrcweir } 741