2007-07-05 08:10:07 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* Copyright 2008 by Sun Microsystems, Inc.
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* $RCSfile: DataFlavorMapping.cxx,v $
|
2008-07-01 22:00:52 +00:00
|
|
|
* $Revision: 1.5 $
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
2008-04-11 06:20:01 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2007-07-05 08:10:07 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#include <DataFlavorMapping.hxx>
|
|
|
|
#include "HtmlFmtFlt.hxx"
|
|
|
|
#include "PictToBmpFlt.hxx"
|
|
|
|
#include <com/sun/star/datatransfer/UnsupportedFlavorException.hpp>
|
|
|
|
#include <com/sun/star/datatransfer/XMimeContentType.hpp>
|
|
|
|
#include "com/sun/star/uno/Sequence.hxx"
|
|
|
|
|
|
|
|
#include <rtl/ustring.hxx>
|
2008-02-18 13:46:25 +00:00
|
|
|
#include <rtl/memory.h>
|
2007-07-05 08:10:07 +00:00
|
|
|
#include <osl/endian.h>
|
|
|
|
|
|
|
|
#include <vector>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include <premac.h>
|
|
|
|
#include <QuickTime/QuickTime.h>
|
|
|
|
#include <postmac.h>
|
|
|
|
|
|
|
|
using namespace ::com::sun::star::datatransfer;
|
|
|
|
using namespace rtl;
|
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace com::sun::star::lang;
|
|
|
|
using namespace cppu;
|
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
namespace // private
|
|
|
|
{
|
|
|
|
const Type CPPUTYPE_SEQINT8 = getCppuType((Sequence<sal_Int8>*)0);
|
|
|
|
const Type CPPUTYPE_OUSTRING = getCppuType( (OUString*)0 );
|
|
|
|
|
|
|
|
/* Determine whether or not a DataFlavor is valid.
|
|
|
|
*/
|
|
|
|
bool isValidFlavor(const DataFlavor& aFlavor)
|
|
|
|
{
|
|
|
|
size_t len = aFlavor.MimeType.getLength();
|
|
|
|
Type dtype = aFlavor.DataType;
|
|
|
|
return ((len > 0) && ((dtype == CPPUTYPE_SEQINT8) || (dtype == CPPUTYPE_OUSTRING)));
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
typedef vector<sal_Unicode> UnicodeBuffer;
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
OUString NSStringToOUString(NSString* cfString)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
BOOST_ASSERT(cfString && "Invalid parameter");
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
const char* utf8Str = [cfString UTF8String];
|
|
|
|
unsigned int len = rtl_str_getLength(utf8Str);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return OUString(utf8Str, len, RTL_TEXTENCODING_UTF8);
|
|
|
|
}
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSString* OUStringToNSString(const OUString& ustring)
|
|
|
|
{
|
|
|
|
OString utf8Str = OUStringToOString(ustring, RTL_TEXTENCODING_UTF8);
|
|
|
|
return [NSString stringWithCString: utf8Str.getStr() encoding: NSUTF8StringEncoding];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
|
|
|
|
const NSString* PBTYPE_UT16 = @"CorePasteboardFlavorType 0x75743136";
|
|
|
|
const NSString* PBTYPE_PICT = @"CorePasteboardFlavorType 0x50494354";
|
|
|
|
const NSString* PBTYPE_HTML = @"CorePasteboardFlavorType 0x48544D4C";
|
|
|
|
const NSString* PBTYPE_SODX = @"application/x-openoffice-objectdescriptor-xml;windows_formatname=\"Star Object Descriptor (XML)\"";
|
|
|
|
const NSString* PBTYPE_SESX = @"application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\"";
|
|
|
|
const NSString* PBTYPE_SLSDX = @"application/x-openoffice-linksrcdescriptor-xml;windows_formatname=\"Star Link Source Descriptor (XML)\"";
|
|
|
|
const NSString* PBTYPE_ESX = @"application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\"";
|
|
|
|
const NSString* PBTYPE_LSX = @"application/x-openoffice-link-source-xml;windows_formatname=\"Star Link Source (XML)\"";
|
|
|
|
const NSString* PBTYPE_EOX = @"application/x-openoffice-embedded-obj-xml;windows_formatname=\"Star Embedded Object (XML)\"";
|
|
|
|
const NSString* PBTYPE_SVXB = @"application/x-openoffice-svbx;windows_formatname=\"SVXB (StarView Bitmap/Animation)\"";
|
|
|
|
const NSString* PBTYPE_GDIMF = @"application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"";
|
|
|
|
const NSString* PBTYPE_WMF = @"application/x-openoffice-wmf;windows_formatname=\"Image WMF\"";
|
|
|
|
const NSString* PBTYPE_EMF = @"application/x-openoffice-emf;windows_formatname=\"Image EMF\"";
|
|
|
|
|
2008-07-01 22:00:52 +00:00
|
|
|
const NSString* PBTYPE_DUMMY_INTERNAL = @"application/x-openoffice-internal";
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
const char* FLAVOR_SODX = "application/x-openoffice-objectdescriptor-xml;windows_formatname=\"Star Object Descriptor (XML)\"";
|
|
|
|
const char* FLAVOR_SESX = "application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\"";
|
|
|
|
const char* FLAVOR_SLSDX = "application/x-openoffice-linksrcdescriptor-xml;windows_formatname=\"Star Link Source Descriptor (XML)\"";
|
|
|
|
const char* FLAVOR_ESX = "application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\"";
|
|
|
|
const char* FLAVOR_LSX = "application/x-openoffice-link-source-xml;windows_formatname=\"Star Link Source (XML)\"";
|
|
|
|
const char* FLAVOR_EOX = "application/x-openoffice-embedded-obj-xml;windows_formatname=\"Star Embedded Object (XML)\"";
|
|
|
|
const char* FLAVOR_SVXB = "application/x-openoffice-svbx;windows_formatname=\"SVXB (StarView Bitmap/Animation)\"";
|
|
|
|
const char* FLAVOR_GDIMF = "application/x-openoffice-gdimetafile;windows_formatname=\"GDIMetaFile\"";
|
|
|
|
const char* FLAVOR_WMF = "application/x-openoffice-wmf;windows_formatname=\"Image WMF\"";
|
|
|
|
const char* FLAVOR_EMF = "application/x-openoffice-emf;windows_formatname=\"Image EMF\"";
|
|
|
|
|
2008-07-01 22:00:52 +00:00
|
|
|
const char* FLAVOR_DUMMY_INTERNAL = "application/x-openoffice-internal";
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
|
2007-07-05 08:10:07 +00:00
|
|
|
struct FlavorMap
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
NSString* SystemFlavor;
|
|
|
|
const char* OOoFlavor;
|
|
|
|
const char* HumanPresentableName;
|
2007-07-05 08:10:07 +00:00
|
|
|
Type DataType;
|
|
|
|
};
|
|
|
|
|
|
|
|
/* At the moment it appears as if only MS Office pastes "public.html" to the clipboard.
|
|
|
|
*/
|
|
|
|
FlavorMap flavorMap[] =
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
{ NSStringPboardType, "text/plain;charset=utf-16", "Unicode Text (UTF-16)", CPPUTYPE_OUSTRING },
|
|
|
|
{ NSRTFPboardType, "text/richtext", "Rich Text Format", CPPUTYPE_SEQINT8 },
|
|
|
|
{ NSPICTPboardType, "image/bmp", "Windows Bitmap", CPPUTYPE_SEQINT8 },
|
|
|
|
{ NSHTMLPboardType, "text/html", "Plain Html", CPPUTYPE_SEQINT8 },
|
|
|
|
{ NSFilenamesPboardType, "application/x-openoffice-filelist;windows_formatname=\"FileList\"", "FileList", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_SESX, FLAVOR_SESX, "Star Embed Source (XML)", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_SLSDX, FLAVOR_SLSDX, "Star Link Source Descriptor (XML)", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_ESX, FLAVOR_ESX, "Star Embed Source (XML)", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_LSX, FLAVOR_LSX, "Star Link Source (XML)", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_EOX, FLAVOR_EOX, "Star Embedded Object (XML)", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_SVXB, FLAVOR_SVXB, "SVXB (StarView Bitmap/Animation", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_GDIMF, FLAVOR_GDIMF, "GDIMetaFile", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_WMF, FLAVOR_WMF, "Windows MetaFile", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_EMF, FLAVOR_EMF, "Windows Enhanced MetaFile", CPPUTYPE_SEQINT8 },
|
|
|
|
{ PBTYPE_SODX, FLAVOR_SODX, "Star Object Descriptor (XML)", CPPUTYPE_SEQINT8 },
|
2008-07-01 22:00:52 +00:00
|
|
|
{ PBTYPE_DUMMY_INTERNAL, FLAVOR_DUMMY_INTERNAL, "internal data",CPPUTYPE_SEQINT8 }
|
2008-02-18 13:46:25 +00:00
|
|
|
// { PBTYPE_UT16, "text/plain;charset=utf-16", "Unicode Text (UTF-16)", CPPUTYPE_OUSTRING }
|
|
|
|
// { kUTTypePICT, @"PICT", "image/x-macpict;windows_formatname=\"Mac Pict\"", "Mac Pict", CPPUTYPE_SEQINT8 }
|
|
|
|
// { kUTTypeHTML, @"HTML", "text/html", "Plain Html", CPPUTYPE_SEQINT8 }
|
2007-07-05 08:10:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
#define SIZE_FLAVOR_MAP (sizeof(flavorMap)/sizeof(FlavorMap))
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
|
|
|
|
inline bool isByteSequenceType(const Type& theType)
|
|
|
|
{
|
|
|
|
return (theType == CPPUTYPE_SEQINT8);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool isOUStringType(const Type& theType)
|
|
|
|
{
|
|
|
|
return (theType == CPPUTYPE_OUSTRING);
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace private
|
|
|
|
|
|
|
|
|
|
|
|
//###########################
|
|
|
|
|
|
|
|
/* A base class for other data provider.
|
|
|
|
*/
|
|
|
|
class DataProviderBaseImpl : public DataProvider
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
DataProviderBaseImpl(const Any& data);
|
2008-02-18 13:46:25 +00:00
|
|
|
DataProviderBaseImpl(id data);
|
2007-07-05 08:10:07 +00:00
|
|
|
virtual ~DataProviderBaseImpl();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
Any mData;
|
2008-02-18 13:46:25 +00:00
|
|
|
//NSData* mSystemData;
|
|
|
|
id mSystemData;
|
2007-07-05 08:10:07 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
DataProviderBaseImpl::DataProviderBaseImpl(const Any& data) :
|
|
|
|
mData(data),
|
2008-02-18 13:46:25 +00:00
|
|
|
mSystemData(nil)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
DataProviderBaseImpl::DataProviderBaseImpl(id data) :
|
2007-07-05 08:10:07 +00:00
|
|
|
mSystemData(data)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
[mSystemData retain];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
|
2007-07-05 08:10:07 +00:00
|
|
|
DataProviderBaseImpl::~DataProviderBaseImpl()
|
|
|
|
{
|
|
|
|
if (mSystemData)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
[mSystemData release];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//#################################
|
|
|
|
|
|
|
|
class UniDataProvider : public DataProviderBaseImpl
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
UniDataProvider(const Any& data);
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
UniDataProvider(NSData* data);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
virtual NSData* getSystemData();
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
virtual Any getOOoData();
|
|
|
|
};
|
|
|
|
|
|
|
|
UniDataProvider::UniDataProvider(const Any& data) :
|
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
UniDataProvider::UniDataProvider(NSData* data) :
|
2007-07-05 08:10:07 +00:00
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSData* UniDataProvider::getSystemData()
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
OUString ustr;
|
|
|
|
mData >>= ustr;
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
OString strUtf8;
|
|
|
|
ustr.convertToString(&strUtf8, RTL_TEXTENCODING_UTF8, OUSTRING_TO_OSTRING_CVTFLAGS);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return [NSData dataWithBytes: strUtf8.getStr() length: strUtf8.getLength()];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Any UniDataProvider::getOOoData()
|
|
|
|
{
|
|
|
|
Any oOOData;
|
|
|
|
|
|
|
|
if (mSystemData)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
oOOData = makeAny(OUString(reinterpret_cast<const sal_Char*>([mSystemData bytes]),
|
|
|
|
[mSystemData length],
|
|
|
|
RTL_TEXTENCODING_UTF8));
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
oOOData = mData;
|
|
|
|
}
|
|
|
|
|
|
|
|
return oOOData;
|
|
|
|
}
|
|
|
|
|
|
|
|
//###########################
|
|
|
|
|
|
|
|
class ByteSequenceDataProvider : public DataProviderBaseImpl
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
ByteSequenceDataProvider(const Any& data);
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
ByteSequenceDataProvider(NSData* data);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
virtual NSData* getSystemData();
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
virtual Any getOOoData();
|
|
|
|
};
|
|
|
|
|
|
|
|
ByteSequenceDataProvider::ByteSequenceDataProvider(const Any& data) :
|
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
ByteSequenceDataProvider::ByteSequenceDataProvider(NSData* data) :
|
2007-07-05 08:10:07 +00:00
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
|
|
|
|
NSData* ByteSequenceDataProvider::getSystemData()
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
Sequence<sal_Int8> rawData;
|
|
|
|
mData >>= rawData;
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return [NSData dataWithBytes: rawData.getArray() length: rawData.getLength()];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Any ByteSequenceDataProvider::getOOoData()
|
|
|
|
{
|
|
|
|
Any oOOData;
|
|
|
|
|
|
|
|
if (mSystemData)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
unsigned int flavorDataLength = [mSystemData length];
|
2007-07-05 08:10:07 +00:00
|
|
|
Sequence<sal_Int8> byteSequence;
|
|
|
|
byteSequence.realloc(flavorDataLength);
|
2008-02-18 13:46:25 +00:00
|
|
|
memcpy(byteSequence.getArray(), [mSystemData bytes], flavorDataLength);
|
2007-07-05 08:10:07 +00:00
|
|
|
oOOData = makeAny(byteSequence);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
oOOData = mData;
|
|
|
|
}
|
|
|
|
|
|
|
|
return oOOData;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//###########################
|
|
|
|
|
|
|
|
class HTMLFormatDataProvider : public DataProviderBaseImpl
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
HTMLFormatDataProvider(const Any& data);
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
HTMLFormatDataProvider(NSData* data);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
virtual NSData* getSystemData();
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
virtual Any getOOoData();
|
|
|
|
};
|
|
|
|
|
|
|
|
HTMLFormatDataProvider::HTMLFormatDataProvider(const Any& data) :
|
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
HTMLFormatDataProvider::HTMLFormatDataProvider(NSData* data) :
|
2007-07-05 08:10:07 +00:00
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSData* HTMLFormatDataProvider::getSystemData()
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
Sequence<sal_Int8> textHtmlData;
|
|
|
|
mData >>= textHtmlData;
|
|
|
|
|
|
|
|
Sequence<sal_Int8> htmlFormatData = TextHtmlToHTMLFormat(textHtmlData);
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return [NSData dataWithBytes: htmlFormatData.getArray() length: htmlFormatData.getLength()];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Any HTMLFormatDataProvider::getOOoData()
|
|
|
|
{
|
|
|
|
Any oOOData;
|
|
|
|
|
|
|
|
if (mSystemData)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
unsigned int flavorDataLength = [mSystemData length];
|
2007-07-05 08:10:07 +00:00
|
|
|
Sequence<sal_Int8> unkHtmlData;
|
|
|
|
|
|
|
|
unkHtmlData.realloc(flavorDataLength);
|
2008-02-18 13:46:25 +00:00
|
|
|
memcpy(unkHtmlData.getArray(), [mSystemData bytes], flavorDataLength);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
Sequence<sal_Int8>* pPlainHtml = &unkHtmlData;
|
|
|
|
Sequence<sal_Int8> plainHtml;
|
|
|
|
|
|
|
|
if (isHTMLFormat(unkHtmlData))
|
|
|
|
{
|
|
|
|
plainHtml = HTMLFormatToTextHtml(unkHtmlData);
|
|
|
|
pPlainHtml = &plainHtml;
|
|
|
|
}
|
|
|
|
|
|
|
|
oOOData = makeAny(*pPlainHtml);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
oOOData = mData;
|
|
|
|
}
|
|
|
|
|
|
|
|
return oOOData;
|
|
|
|
}
|
|
|
|
|
|
|
|
//###########################
|
|
|
|
|
|
|
|
class BMPDataProvider : public DataProviderBaseImpl
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
BMPDataProvider(const Any& data);
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
BMPDataProvider(NSData* data);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
virtual NSData* getSystemData();
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
virtual Any getOOoData();
|
|
|
|
};
|
|
|
|
|
|
|
|
BMPDataProvider::BMPDataProvider(const Any& data) :
|
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
BMPDataProvider::BMPDataProvider(NSData* data) :
|
2007-07-05 08:10:07 +00:00
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSData* BMPDataProvider::getSystemData()
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
Sequence<sal_Int8> bmpData;
|
|
|
|
mData >>= bmpData;
|
|
|
|
|
|
|
|
Sequence<sal_Int8> pictData;
|
2008-02-18 13:46:25 +00:00
|
|
|
NSData* sysData = NULL;
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
if (BMPtoPICT(bmpData, pictData))
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
sysData = [NSData dataWithBytes: pictData.getArray() length: pictData.getLength()];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return sysData;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* At the moment the OOo 'PCT' filter is not good enough to be used
|
|
|
|
and there is no flavor defined for exchanging 'PCT' with OOo so
|
|
|
|
we will at the moment convert 'PCT' to a Windows BMP and provide
|
|
|
|
this to OOo
|
|
|
|
*/
|
|
|
|
Any BMPDataProvider::getOOoData()
|
|
|
|
{
|
|
|
|
Any oOOData;
|
|
|
|
|
|
|
|
if (mSystemData)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
unsigned int flavorDataLength = [mSystemData length];
|
2007-07-05 08:10:07 +00:00
|
|
|
Sequence<sal_Int8> pictData(flavorDataLength);
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
memcpy(pictData.getArray(), [mSystemData bytes], flavorDataLength);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
|
|
|
Sequence<sal_Int8> bmpData;
|
|
|
|
|
|
|
|
if (PICTtoBMP(pictData, bmpData))
|
|
|
|
{
|
|
|
|
oOOData = makeAny(bmpData);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
oOOData = mData;
|
|
|
|
}
|
|
|
|
|
|
|
|
return oOOData;
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
//######################
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
class FileListDataProvider : public DataProviderBaseImpl
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
FileListDataProvider(const Any& data);
|
|
|
|
FileListDataProvider(NSArray* data);
|
|
|
|
|
|
|
|
virtual NSData* getSystemData();
|
|
|
|
virtual Any getOOoData();
|
|
|
|
};
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
FileListDataProvider::FileListDataProvider(const Any& data) :
|
|
|
|
DataProviderBaseImpl(data)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
}
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
FileListDataProvider::FileListDataProvider(NSArray* data) :
|
|
|
|
DataProviderBaseImpl(data)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
NSData* FileListDataProvider::getSystemData()
|
|
|
|
{
|
|
|
|
return [NSData data];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
Any FileListDataProvider::getOOoData()
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
Any oOOData;
|
|
|
|
|
|
|
|
if (mSystemData)
|
|
|
|
{
|
|
|
|
size_t length = [mSystemData count];
|
|
|
|
size_t lenSeqRequired = 0;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < length; i++)
|
|
|
|
{
|
|
|
|
NSString* fname = [mSystemData objectAtIndex: i];
|
|
|
|
lenSeqRequired += [fname maximumLengthOfBytesUsingEncoding: NSUnicodeStringEncoding] + sizeof(unichar);
|
|
|
|
}
|
|
|
|
|
|
|
|
Sequence<sal_Int8> oOOFileList(lenSeqRequired);
|
|
|
|
unichar* pBuffer = reinterpret_cast<unichar*>(oOOFileList.getArray());
|
|
|
|
rtl_zeroMemory(pBuffer, lenSeqRequired);
|
|
|
|
|
|
|
|
for (size_t i = 0; i < length; i++)
|
|
|
|
{
|
|
|
|
NSString* fname = [mSystemData objectAtIndex: i];
|
|
|
|
[fname getCharacters: pBuffer];
|
|
|
|
size_t l = [fname length];
|
|
|
|
pBuffer += l + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
oOOData = makeAny(oOOFileList);
|
|
|
|
}
|
|
|
|
else
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
oOOData = mData;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return oOOData;
|
|
|
|
}
|
|
|
|
|
|
|
|
//###########################
|
|
|
|
|
|
|
|
DataFlavorMapper::DataFlavorMapper(const Reference<XComponentContext>& context) :
|
|
|
|
mXComponentContext(context)
|
|
|
|
{
|
|
|
|
Reference<XMultiComponentFactory> mrServiceManager = mXComponentContext->getServiceManager();
|
|
|
|
mrXMimeCntFactory = Reference<XMimeContentTypeFactory>(mrServiceManager->createInstanceWithContext(
|
|
|
|
OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.datatransfer.MimeContentTypeFactory")), mXComponentContext), UNO_QUERY);
|
|
|
|
|
|
|
|
if (!mrXMimeCntFactory.is())
|
|
|
|
throw RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM("AquaClipboard: Cannot create com.sun.star.datatransfer.MimeContentTypeFactory")), NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
DataFlavor DataFlavorMapper::systemToOpenOfficeFlavor(NSString* systemDataFlavor) const
|
|
|
|
{
|
2007-07-05 08:10:07 +00:00
|
|
|
DataFlavor oOOFlavor;
|
|
|
|
|
|
|
|
for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
if ([systemDataFlavor caseInsensitiveCompare: flavorMap[i].SystemFlavor] == NSOrderedSame)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
oOOFlavor.MimeType = OUString::createFromAscii(flavorMap[i].OOoFlavor);
|
|
|
|
oOOFlavor.HumanPresentableName = OUString(RTL_CONSTASCII_USTRINGPARAM(flavorMap[i].HumanPresentableName));
|
|
|
|
oOOFlavor.DataType = flavorMap[i].DataType;
|
2008-02-18 13:46:25 +00:00
|
|
|
return oOOFlavor;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
} // for
|
|
|
|
|
|
|
|
return oOOFlavor;
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSString* DataFlavorMapper::openOfficeToSystemFlavor(const DataFlavor& oOOFlavor) const
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
NSString* sysFlavor = NULL;
|
|
|
|
|
2007-07-05 08:10:07 +00:00
|
|
|
for (size_t i = 0; i < SIZE_FLAVOR_MAP; i++)
|
|
|
|
{
|
|
|
|
if (oOOFlavor.MimeType.compareToAscii(flavorMap[i].OOoFlavor, strlen(flavorMap[i].OOoFlavor)) == 0)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
sysFlavor = flavorMap[i].SystemFlavor;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return sysFlavor;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
DataProviderPtr_t DataFlavorMapper::getDataProvider(NSString* systemFlavor, Reference<XTransferable> rTransferable) const
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
DataProviderPtr_t dp;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
DataFlavor oOOFlavor = systemToOpenOfficeFlavor(systemFlavor);
|
|
|
|
|
|
|
|
Any data = rTransferable->getTransferData(oOOFlavor);
|
|
|
|
|
|
|
|
if (isByteSequenceType(data.getValueType()))
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
if ([systemFlavor caseInsensitiveCompare: NSHTMLPboardType] == NSOrderedSame)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new HTMLFormatDataProvider(data));
|
|
|
|
}
|
2008-02-18 13:46:25 +00:00
|
|
|
else if ([systemFlavor caseInsensitiveCompare: NSPICTPboardType] == NSOrderedSame)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new BMPDataProvider(data));
|
|
|
|
}
|
2008-02-18 13:46:25 +00:00
|
|
|
else if ([systemFlavor caseInsensitiveCompare: NSFilenamesPboardType] == NSOrderedSame)
|
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new FileListDataProvider(data));
|
|
|
|
}
|
2007-07-05 08:10:07 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new ByteSequenceDataProvider(data));
|
|
|
|
}
|
|
|
|
}
|
2008-02-18 13:46:25 +00:00
|
|
|
else // Must be OUString type
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
BOOST_ASSERT(isOUStringType(data.getValueType()));
|
2007-07-05 08:10:07 +00:00
|
|
|
dp = DataProviderPtr_t(new UniDataProvider(data));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch(UnsupportedFlavorException&)
|
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
// Somebody violates the contract of the clipboard
|
|
|
|
// interface @see XTransferable
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return dp;
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
DataProviderPtr_t DataFlavorMapper::getDataProvider(const NSString* systemFlavor, NSArray* systemData) const
|
|
|
|
{
|
|
|
|
return DataProviderPtr_t(new FileListDataProvider(systemData));
|
|
|
|
}
|
|
|
|
|
|
|
|
DataProviderPtr_t DataFlavorMapper::getDataProvider(const NSString* systemFlavor, NSData* systemData) const
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
DataProviderPtr_t dp;
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
if ([systemFlavor caseInsensitiveCompare: NSStringPboardType] == NSOrderedSame)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new UniDataProvider(systemData));
|
|
|
|
}
|
2008-02-18 13:46:25 +00:00
|
|
|
else if ([systemFlavor caseInsensitiveCompare: NSHTMLPboardType] == NSOrderedSame)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new HTMLFormatDataProvider(systemData));
|
|
|
|
}
|
2008-02-18 13:46:25 +00:00
|
|
|
else if ([systemFlavor caseInsensitiveCompare: NSPICTPboardType] == NSOrderedSame)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new BMPDataProvider(systemData));
|
2008-02-18 13:46:25 +00:00
|
|
|
}
|
|
|
|
else if ([systemFlavor caseInsensitiveCompare: NSFilenamesPboardType] == NSOrderedSame)
|
|
|
|
{
|
|
|
|
//dp = DataProviderPtr_t(new FileListDataProvider(systemData));
|
|
|
|
}
|
2007-07-05 08:10:07 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
dp = DataProviderPtr_t(new ByteSequenceDataProvider(systemData));
|
|
|
|
}
|
|
|
|
|
|
|
|
return dp;
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
bool DataFlavorMapper::isValidMimeContentType(const rtl::OUString& contentType) const
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
bool result = true;
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
try
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
Reference<XMimeContentType> xCntType(mrXMimeCntFactory->createMimeContentType(contentType));
|
|
|
|
}
|
|
|
|
catch( IllegalArgumentException& )
|
|
|
|
{
|
|
|
|
result = false;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return result;
|
|
|
|
}
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSArray* DataFlavorMapper::flavorSequenceToTypesArray(const com::sun::star::uno::Sequence<com::sun::star::datatransfer::DataFlavor>& flavors) const
|
|
|
|
{
|
|
|
|
sal_uInt32 nFlavors = flavors.getLength();
|
|
|
|
NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity: 1];
|
|
|
|
|
2008-07-01 22:00:52 +00:00
|
|
|
if( nFlavors == 0 ) // #i89462# work around insane impress implementation
|
|
|
|
{
|
|
|
|
[array addObject: PBTYPE_DUMMY_INTERNAL];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (sal_uInt32 i = 0; i < nFlavors; i++)
|
|
|
|
{
|
|
|
|
NSString* str = openOfficeToSystemFlavor(flavors[i]);
|
|
|
|
|
|
|
|
if (str != NULL)
|
|
|
|
{
|
|
|
|
[array addObject: str];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return [array autorelease];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
com::sun::star::uno::Sequence<com::sun::star::datatransfer::DataFlavor> DataFlavorMapper::typesArrayToFlavorSequence(NSArray* types) const
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
int nFormats = [types count];
|
|
|
|
Sequence<DataFlavor> flavors;
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
for (int i = 0; i < nFormats; i++)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
NSString* sysFormat = [types objectAtIndex: i];
|
|
|
|
DataFlavor oOOFlavor = systemToOpenOfficeFlavor(sysFormat);
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
if (isValidFlavor(oOOFlavor))
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
flavors.realloc(flavors.getLength() + 1);
|
|
|
|
flavors[flavors.getLength() - 1] = oOOFlavor;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return flavors;
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
NSArray* DataFlavorMapper::getAllSupportedPboardTypes() const
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
NSMutableArray* array = [[NSMutableArray alloc] initWithCapacity: SIZE_FLAVOR_MAP];
|
2007-07-05 08:10:07 +00:00
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
for (sal_uInt32 i = 0; i < SIZE_FLAVOR_MAP; i++)
|
2007-07-05 08:10:07 +00:00
|
|
|
{
|
2008-02-18 13:46:25 +00:00
|
|
|
[array addObject: flavorMap[i].SystemFlavor];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|
|
|
|
|
2008-02-18 13:46:25 +00:00
|
|
|
return [array autorelease];
|
2007-07-05 08:10:07 +00:00
|
|
|
}
|