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