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