25 #include <osl/mutex.hxx>
26 #include <rtl/uri.hxx>
47 #include <com/sun/star/datatransfer/UnsupportedFlavorException.hpp>
48 #include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp>
49 #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp>
50 #include <com/sun/star/datatransfer/MimeContentTypeFactory.hpp>
51 #include <com/sun/star/datatransfer/XMimeContentType.hpp>
52 #include <com/sun/star/datatransfer/XTransferable2.hpp>
53 #include <com/sun/star/frame/Desktop.hpp>
60 #include <rtl/strbuf.hxx>
79 #define TOD_SIG1 0x01234567
80 #define TOD_SIG2 0x89abcdef
84 const sal_uInt32 nFirstPos = rOStm.
Tell(), nViewAspect = rObjDesc.
mnViewAspect;
98 const sal_uInt32 nLastPos = rOStm.
Tell();
100 rOStm.
Seek( nFirstPos );
102 rOStm.
Seek( nLastPos );
117 if( !aClassName.isEmpty() )
119 aParams +=
";classname=\"" + aClassName +
"\"";
124 aParams +=
";typename=\"" + rObjDesc.
maTypeName +
"\"";
135 const char aQuotedParamChars[] =
136 "()<>@,;:/[]?=!#$&'*+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~. ";
138 for ( sal_Int32 nInd = 0; nInd < RTL_CONSTASCII_LENGTH(aQuotedParamChars); ++nInd )
142 pToAccept[nChar] =
true;
145 aParams +=
";displayname=\""
147 rObjDesc.
maDisplayName, pToAccept, rtl_UriEncodeIgnoreEscapes,
148 RTL_TEXTENCODING_UTF8)
152 aParams +=
";viewaspect=\"" + OUString::number(rObjDesc.
mnViewAspect)
153 +
"\";width=\"" + OUString::number(rObjDesc.
maSize.
Width())
154 +
"\";height=\"" + OUString::number(rObjDesc.
maSize.
Height())
156 +
"\";posy=\"" + OUString::number(rObjDesc.
maDragStartPos.X()) +
"\"";
168 Reference< XMimeContentTypeFactory > xMimeFact = MimeContentTypeFactory::create( xContext );
170 Reference< XMimeContentType > xMimeType( xMimeFact->createMimeContentType( rFlavorEx.MimeType ) );
174 static const OUStringLiteral aClassNameString(
u"classname" );
175 static const OUStringLiteral aTypeNameString(
u"typename" );
176 static const OUStringLiteral aDisplayNameString(
u"displayname" );
177 static const OUStringLiteral aViewAspectString(
u"viewaspect" );
178 static const OUStringLiteral aWidthString(
u"width" );
179 static const OUStringLiteral aHeightString(
u"height" );
180 static const OUStringLiteral aPosXString(
u"posx" );
181 static const OUStringLiteral aPosYString(
u"posy" );
183 if( xMimeType->hasParameter( aClassNameString ) )
188 if( xMimeType->hasParameter( aTypeNameString ) )
190 rObjDesc.
maTypeName = xMimeType->getParameterValue( aTypeNameString );
193 if( xMimeType->hasParameter( aDisplayNameString ) )
197 rObjDesc.
maDisplayName = ::rtl::Uri::decode( xMimeType->getParameterValue( aDisplayNameString ), rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 );
200 if( xMimeType->hasParameter( aViewAspectString ) )
202 rObjDesc.
mnViewAspect =
static_cast< sal_uInt16
>( xMimeType->getParameterValue( aViewAspectString ).toInt32() );
205 if( xMimeType->hasParameter( aWidthString ) )
207 rObjDesc.
maSize.
setWidth( xMimeType->getParameterValue( aWidthString ).toInt32() );
210 if( xMimeType->hasParameter( aHeightString ) )
212 rObjDesc.
maSize.
setHeight( xMimeType->getParameterValue( aHeightString ).toInt32() );
215 if( xMimeType->hasParameter( aPosXString ) )
217 rObjDesc.
maDragStartPos.setX( xMimeType->getParameterValue( aPosXString ).toInt32() );
220 if( xMimeType->hasParameter( aPosYString ) )
222 rObjDesc.
maDragStartPos.setY( xMimeType->getParameterValue( aPosYString ).toInt32() );
226 catch(
const css::uno::Exception& )
260 return "com.sun.star.comp.svt.TransferableHelperTerminateListener";
275 css::uno::Reference<css::frame::XTerminateListener> listener;
302 DataFlavor aSubstFlavor;
313 GetData(aSubstFlavor, rDestDoc);
314 bDone =
maAny.hasValue();
320 GetData(aSubstFlavor, rDestDoc);
327 GetData(aSubstFlavor, rDestDoc);
329 if(
maAny.hasValue() )
335 std::unique_ptr<SvMemoryStream> pSrcStm(
new SvMemoryStream( aSeq.getArray(), aSeq.getLength(), StreamMode::WRITE | StreamMode::TRUNC ));
346 maAny <<= Sequence< sal_Int8 >(
static_cast< const sal_Int8*
>( aDstStm.
GetData() ),
357 GetData(aSubstFlavor, rDestDoc);
359 if(
maAny.hasValue() )
365 std::unique_ptr<SvMemoryStream> pSrcStm(
new SvMemoryStream( aSeq.getArray(), aSeq.getLength(), StreamMode::WRITE | StreamMode::TRUNC ));
376 maAny <<= Sequence< sal_Int8 >(
static_cast< const sal_Int8*
>( aDstStm.
GetData() ),
385 if( !bDone &&
maAny.hasValue() )
389 if( !
maAny.hasValue() )
392 catch(
const css::uno::Exception& )
396 if( !
maAny.hasValue() )
397 throw UnsupportedFlavorException();
419 catch(
const css::uno::Exception& )
423 return comphelper::containerToSequence<DataFlavor>(
maFormats);
436 catch(
const css::uno::Exception& )
468 catch(
const css::uno::Exception& )
485 DragFinished( rDSDE.DropSuccess ? ( rDSDE.DropAction & ~DNDConstants::ACTION_DEFAULT ) : DNDConstants::ACTION_NONE );
488 catch(
const css::uno::Exception& )
518 if( isUnoTunnelId<TransferableHelper>(rId) )
520 nRet = sal::static_int_cast<sal_Int64>(
reinterpret_cast<sal_IntPtr
>(
this));
534 Reference< XFlushableClipboard > xFlushableClipboard(
mxClipboard, UNO_QUERY );
539 if( xFlushableClipboard.is() )
540 xFlushableClipboard->flushClipboard();
542 catch(
const css::uno::Exception& )
544 OSL_FAIL(
"Could not flush clipboard" );
567 if ((SotClipboardFormatId::OBJECTDESCRIPTOR == format.mnSotId) &&
mxObjDesc)
569 DataFlavor aObjDescFlavor;
572 format.MimeType = aObjDescFlavor.MimeType;
586 aFlavorEx.MimeType = rFlavor.MimeType;
587 aFlavorEx.HumanPresentableName = rFlavor.HumanPresentableName;
588 aFlavorEx.DataType = rFlavor.DataType;
591 if ((SotClipboardFormatId::OBJECTDESCRIPTOR == aFlavorEx.
mnSotId) &&
mxObjDesc)
594 maFormats.push_back(aFlavorEx);
596 if( SotClipboardFormatId::BITMAP == aFlavorEx.
mnSotId )
601 else if( SotClipboardFormatId::GDIMETAFILE == aFlavorEx.
mnSotId )
620 DataFlavorExVector::iterator aIter(maFormats.begin());
622 while (aIter != maFormats.end())
625 aIter = maFormats.erase(aIter);
634 return std::any_of(maFormats.begin(), maFormats.end(),
649 return maAny.hasValue();
655 DataFlavor aFileFlavor;
657 if( !rString.isEmpty() &&
664 memcpy(
aSeq.getArray(), aByteStr.getStr(), aByteStr.getLength() );
665 aSeq[ aByteStr.getLength() ] = 0;
671 return maAny.hasValue();
681 if(rFlavor.MimeType.equalsIgnoreAsciiCase(
"image/png"))
684 css::uno::Sequence<css::beans::PropertyValue> aFilterData;
688 aFilterData.realloc(aFilterData.getLength() + 1);
689 aFilterData[aFilterData.getLength() - 1].Name =
"Compression";
698 aFilterData[aFilterData.getLength() - 1].Value <<= 1;
702 aPNGWriter.
Write(aMemStm);
713 return maAny.hasValue();
727 return maAny.hasValue();
746 return maAny.hasValue();
755 rIMap.
Write( aMemStm );
758 return maAny.hasValue();
769 maAny <<= Sequence< sal_Int8 >(
static_cast< const sal_Int8*
>( aMemStm.
GetData() ), aMemStm.
Tell() );
771 return maAny.hasValue();
776 const css::datatransfer::DataFlavor& rFlavor )
778 rtl_TextEncoding eSysCSet = osl_getThreadTextEncoding();
782 case SotClipboardFormatId::SOLK:
787 sOut.append(sURL.getLength());
788 sOut.append(
'@').append(sURL);
789 sOut.append(sDesc.getLength());
790 sOut.append(
'@').append(sDesc);
793 memcpy(
aSeq.getArray(), sOut.getStr(), sOut.getLength());
798 case SotClipboardFormatId::STRING:
802 case SotClipboardFormatId::UNIFORMRESOURCELOCATOR:
806 memcpy(
aSeq.getArray(), sURL.getStr(), sURL.getLength() );
811 case SotClipboardFormatId::NETSCAPE_BOOKMARK:
815 memset( aSeq.getArray(), 0, 2048 );
824 case SotClipboardFormatId::FILEGRPDESCRIPTOR:
827 FILEGROUPDESCRIPTOR* pFDesc =
reinterpret_cast<FILEGROUPDESCRIPTOR*
>(aSeq.getArray());
828 FILEDESCRIPTOR& rFDesc1 = pFDesc->fgd[ 0 ];
831 memset( &rFDesc1, 0,
sizeof( FILEDESCRIPTOR ) );
832 rFDesc1.dwFlags = FD_LINKUI;
836 for( sal_Int32 nChar = 0; nChar < aStr.getLength(); ++nChar )
837 if( strchr(
"\\/:*?\"<>|", aStr[nChar] ) )
838 aStr.remove(nChar--, 1);
840 aStr.insert(0,
"Shortcut to ");
842 strcpy( rFDesc1.cFileName, aStr.getStr() );
848 case SotClipboardFormatId::FILECONTENT:
850 maAny <<=
"[InternetShortcut]\x0aURL=" + rBmk.
GetURL();
859 return maAny.hasValue();
864 const css::datatransfer::DataFlavor& rFlavor )
873 return maAny.hasValue();
883 if( pUserObject &&
WriteObject( xStm, pUserObject, nUserObjectId, rFlavor ) )
885 const sal_uInt32 nLen = xStm->TellEnd();
889 xStm->ReadBytes(aSeq.getArray(), nLen);
897 maAny <<= OUString( reinterpret_cast< const char* >( aSeq.getConstArray() ), nLen - 1, RTL_TEXTENCODING_UTF8 );
903 return maAny.hasValue();
909 OSL_FAIL(
"TransferableHelper::WriteObject( ... ) not implemented" );
928 if(
HasFormat( SotClipboardFormatId::OBJECTDESCRIPTOR ) )
929 AddFormat( SotClipboardFormatId::OBJECTDESCRIPTOR );
934 if( rClipboard.is() )
949 catch(
const css::uno::Exception& )
956 DBG_ASSERT( pWindow,
"Window pointer is NULL" );
957 Reference< XClipboard > xClipboard;
977 rSelection->setContents( pThis, pThis );
979 catch(
const css::uno::Exception& )
992 DBG_ASSERT( pWindow,
"Window pointer is NULL" );
993 Reference< XDragSource > xDragSource( pWindow->
GetDragSource() );
995 if( !xDragSource.is() )
1011 #if !defined(MACOSX)
1017 DragGestureEvent aEvt;
1018 aEvt.DragAction = DNDConstants::ACTION_COPY;
1019 aEvt.DragOriginX = aPt.X();
1020 aEvt.DragOriginY = aPt.Y();
1021 aEvt.DragSource = xDragSource;
1025 catch(
const css::uno::Exception& )
1034 if( xSelection.is() )
1035 xSelection->setContents(
nullptr,
nullptr );
1041 return theTransferableHelperUnoTunnelId.
getSeq();
1046 class TransferableClipboardNotifier :
public ::cppu::WeakImplHelper< XClipboardListener >
1049 ::osl::Mutex& mrMutex;
1050 Reference< XClipboardNotifier > mxNotifier;
1055 virtual void SAL_CALL changedContents(
const clipboard::ClipboardEvent& event )
override;
1058 virtual void SAL_CALL
disposing(
const EventObject& Source )
override;
1061 TransferableClipboardNotifier(
const Reference< XClipboard >& _rxClipboard,
TransferableDataHelper& _rListener, ::osl::Mutex& _rMutex );
1064 bool isListening()
const {
return mpListener !=
nullptr; }
1072 TransferableClipboardNotifier::TransferableClipboardNotifier(
const Reference< XClipboard >& _rxClipboard,
TransferableDataHelper& _rListener, ::osl::Mutex& _rMutex )
1074 ,mxNotifier( _rxClipboard, UNO_QUERY )
1077 osl_atomic_increment( &m_refCount );
1079 if ( mxNotifier.is() )
1080 mxNotifier->addClipboardListener(
this );
1085 osl_atomic_decrement( &m_refCount );
1089 void SAL_CALL TransferableClipboardNotifier::changedContents(
const clipboard::ClipboardEvent& event )
1096 ::osl::MutexGuard aGuard( mrMutex );
1102 void SAL_CALL TransferableClipboardNotifier::disposing(
const EventObject& )
1109 void TransferableClipboardNotifier::dispose()
1111 ::osl::MutexGuard aGuard( mrMutex );
1113 Reference< XClipboardListener > xKeepMeAlive(
this );
1115 if ( mxNotifier.is() )
1116 mxNotifier->removeClipboardListener(
this );
1139 : mxTransfer(rxTransferable)
1147 : mxTransfer(rDataHelper.mxTransfer)
1148 , mxClipboard(rDataHelper.mxClipboard)
1149 , maFormats(rDataHelper.maFormats)
1156 : mxTransfer(
std::move(rDataHelper.mxTransfer))
1157 , mxClipboard(
std::move(rDataHelper.mxClipboard))
1158 , maFormats(
std::move(rDataHelper.maFormats))
1159 , mxObjDesc(
std::move(rDataHelper.mxObjDesc))
1166 if (
this != &rDataHelper )
1168 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1170 const bool bWasClipboardListening =
mxImpl->mxClipboardListener.is();
1172 if (bWasClipboardListening)
1180 if (bWasClipboardListening)
1189 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1191 const bool bWasClipboardListening =
mxImpl->mxClipboardListener.is();
1193 if (bWasClipboardListening)
1196 mxTransfer = std::move(rDataHelper.mxTransfer);
1197 maFormats = std::move(rDataHelper.maFormats);
1198 mxObjDesc = std::move(rDataHelper.mxObjDesc);
1201 if (bWasClipboardListening)
1211 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1223 Reference< XMimeContentTypeFactory > xMimeFact = MimeContentTypeFactory::create( xContext );
1225 static const OUStringLiteral aCharsetStr(
u"charset" );
1228 for (
auto const& rFlavor : rDataFlavorSeq)
1230 Reference< XMimeContentType > xMimeType;
1234 if( !rFlavor.MimeType.isEmpty() )
1235 xMimeType = xMimeFact->createMimeContentType( rFlavor.MimeType );
1237 catch(
const css::uno::Exception& )
1241 aFlavorEx.MimeType = rFlavor.MimeType;
1242 aFlavorEx.HumanPresentableName = rFlavor.HumanPresentableName;
1243 aFlavorEx.DataType = rFlavor.DataType;
1246 rDataFlavorExVector.push_back( aFlavorEx );
1249 if(SotClipboardFormatId::BMP == aFlavorEx.
mnSotId || SotClipboardFormatId::PNG == aFlavorEx.
mnSotId || SotClipboardFormatId::JPEG == aFlavorEx.
mnSotId)
1253 aFlavorEx.
mnSotId = SotClipboardFormatId::BITMAP;
1254 rDataFlavorExVector.push_back( aFlavorEx );
1257 else if( SotClipboardFormatId::WMF == aFlavorEx.
mnSotId || SotClipboardFormatId::EMF == aFlavorEx.
mnSotId )
1261 aFlavorEx.
mnSotId = SotClipboardFormatId::GDIMETAFILE;
1262 rDataFlavorExVector.push_back( aFlavorEx );
1265 else if ( SotClipboardFormatId::HTML_SIMPLE == aFlavorEx.
mnSotId )
1268 aFlavorEx.
mnSotId = SotClipboardFormatId::HTML_NO_COMMENT;
1269 rDataFlavorExVector.push_back( aFlavorEx );
1271 else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase(
"text/plain" ) )
1274 if( xMimeType->hasParameter( aCharsetStr ) )
1276 if( xMimeType->getParameterValue( aCharsetStr ).equalsIgnoreAsciiCase(
"unicode" ) ||
1277 xMimeType->getParameterValue( aCharsetStr ).equalsIgnoreAsciiCase(
"utf-16" ) )
1279 rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SotClipboardFormatId::STRING;
1284 else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase(
"text/rtf" ) )
1286 rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SotClipboardFormatId::RTF;
1288 else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase(
"text/richtext" ) )
1290 rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SotClipboardFormatId::RICHTEXT;
1292 else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase(
"text/html" ) )
1295 rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SotClipboardFormatId::HTML;
1297 else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase(
"text/uri-list" ) )
1299 rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SotClipboardFormatId::FILE_LIST;
1301 else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase(
"application/x-openoffice-objectdescriptor-xml" ) )
1303 rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SotClipboardFormatId::OBJECTDESCRIPTOR;
1307 catch(
const css::uno::Exception& )
1315 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1325 for (
auto const& format : maFormats)
1327 if( SotClipboardFormatId::OBJECTDESCRIPTOR == format.mnSotId )
1338 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1339 return std::any_of(maFormats.begin(), maFormats.end(),
1345 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1346 for (
auto const& format : maFormats)
1357 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1358 return maFormats.size();
1363 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1364 DBG_ASSERT(nFormat < maFormats.size(),
"TransferableDataHelper::GetFormat: invalid format index");
1365 return( ( nFormat < maFormats.size() ) ? maFormats[ nFormat ].mnSotId : SotClipboardFormatId::NONE );
1370 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1371 DBG_ASSERT(nFormat < maFormats.size(),
"TransferableDataHelper::GetFormat: invalid format index");
1375 if (nFormat < maFormats.size())
1376 aRet = maFormats[nFormat];
1384 Reference< XTransferable > xRet;
1393 xRet->getTransferDataFlavors();
1396 catch(
const css::uno::Exception& )
1412 aReturn =
GetAny(aFlavor, rDestDoc);
1419 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
1428 Reference<css::datatransfer::XTransferable2> xTransfer2(
mxTransfer, UNO_QUERY);
1430 if( nRequestFormat != SotClipboardFormatId::NONE )
1433 for (
auto const& format : maFormats)
1435 if( ( nRequestFormat == format.mnSotId ) && !rFlavor.MimeType.equalsIgnoreAsciiCase( format.MimeType ) )
1446 if (xTransfer2.is())
1447 aRet = xTransfer2->getTransferData2(format, rDestDoc);
1452 if( aRet.hasValue() )
1457 if( !aRet.hasValue() )
1468 if (xTransfer2.is())
1469 aRet = xTransfer2->getTransferData2(rFlavor, rDestDoc);
1475 catch(
const css::uno::Exception& )
1495 if( aAny.hasValue() )
1500 if( aAny >>= aOUString )
1505 else if( aAny >>= aSeq )
1508 const char* pChars =
reinterpret_cast< const char*
>( aSeq.getConstArray() );
1509 sal_Int32 nLen = aSeq.getLength();
1513 while( nLen && ( 0 == *( pChars + nLen - 1 ) ) )
1516 rStr = OUString( pChars, nLen, osl_getThreadTextEncoding() );
1527 if(SotClipboardFormatId::BITMAP == nFormat)
1558 DataFlavor aSubstFlavor;
1560 bool bSuppressPNG(
false);
1561 bool bSuppressJPEG(
false);
1567 bSuppressJPEG = bRet;
1573 bSuppressPNG = bRet;
1580 bSuppressPNG = bRet;
1581 bSuppressJPEG = bRet;
1586 if(!bSuppressPNG && rFlavor.MimeType.equalsIgnoreAsciiCase(
"image/png"))
1590 rBmpEx = aPNGReader.read();
1592 else if(!bSuppressJPEG && rFlavor.MimeType.equalsIgnoreAsciiCase(
"image/jpeg"))
1635 if(MapUnit::MapPixel != aMapMode.GetMapUnit())
1641 if((aSize.Width() > 50000) || (aSize.Height() > 50000))
1669 DataFlavor aSubstFlavor;
1679 HasFormat( SotClipboardFormatId::EMF ) &&
1693 HasFormat( SotClipboardFormatId::WMF ) &&
1712 if(SotClipboardFormatId::BITMAP == nFormat)
1755 rGraphic = aGraphic;
1766 rGraphic = aBitmapEx;
1816 rIMap.
Read( *xStm );
1853 case SotClipboardFormatId::SOLK:
1854 case SotClipboardFormatId::UNIFORMRESOURCELOCATOR:
1859 if( SotClipboardFormatId::UNIFORMRESOURCELOCATOR == nFormat )
1866 OUString
aURL, aDesc;
1867 sal_Int32 nStart = aString.indexOf(
'@' ), nLen = aString.toInt32();
1869 if( !nLen && aString[ 0 ] !=
'0' )
1871 SAL_INFO(
"svtools",
"SOLK: 1. len=0" );
1873 if( nStart == -1 || nLen > aString.getLength() - nStart - 3 )
1875 SAL_INFO(
"svtools",
"SOLK: 1. illegal start or wrong len" );
1877 aURL = aString.copy( nStart + 1, nLen );
1879 aString = aString.replaceAt( 0, nStart + 1 + nLen,
"" );
1880 nStart = aString.indexOf(
'@' );
1881 nLen = aString.toInt32();
1883 if( !nLen && aString[ 0 ] !=
'0' )
1885 SAL_INFO(
"svtools",
"SOLK: 2. len=0" );
1887 if( nStart == -1 || nLen > aString.getLength() - nStart - 1 )
1889 SAL_INFO(
"svtools",
"SOLK: 2. illegal start or wrong len" );
1891 aDesc = aString.copy( nStart+1, nLen );
1900 case SotClipboardFormatId::NETSCAPE_BOOKMARK:
1902 Sequence<sal_Int8> aSeq =
GetSequence(rFlavor, OUString());
1904 if (2048 == aSeq.getLength())
1906 const char* p1 =
reinterpret_cast< const char*
>( aSeq.getConstArray() );
1907 const char* p2 =
reinterpret_cast< const char*
>( aSeq.getConstArray() ) + 1024;
1908 rBmk =
INetBookmark( OUString( p1, strlen(p1), osl_getThreadTextEncoding() ),
1909 OUString( p2, strlen(p2), osl_getThreadTextEncoding() ) );
1916 case SotClipboardFormatId::FILEGRPDESCRIPTOR:
1918 Sequence<sal_Int8> aSeq =
GetSequence(rFlavor, OUString());
1920 if (aSeq.getLength())
1922 FILEGROUPDESCRIPTOR
const * pFDesc =
reinterpret_cast<FILEGROUPDESCRIPTOR
const *
>(aSeq.getConstArray());
1924 if( pFDesc->cItems )
1926 OString aDesc( pFDesc->fgd[ 0 ].cFileName );
1927 rtl_TextEncoding eTextEncoding = osl_getThreadTextEncoding();
1932 StreamMode::STD_READ ));
1934 if( !pStream || pStream->GetError() )
1936 DataFlavor aFileContentFlavor;
1943 aSeq =
GetSequence(aFileContentFlavor, OUString());
1944 if (aSeq.getLength())
1945 pStream.reset(
new SvMemoryStream( const_cast<sal_Int8 *>(aSeq.getConstArray()), aSeq.getLength(), StreamMode::STD_READ ));
1952 bool bSttFnd =
false;
1954 while( pStream->ReadLine( aLine ) )
1956 if (aLine.equalsIgnoreAsciiCase(
"[InternetShortcut]"))
1958 else if (bSttFnd && aLine.copy(0, 4).equalsIgnoreAsciiCase(
"URL="))
1960 rBmk =
INetBookmark( OStringToOUString(aLine.subView(4), eTextEncoding),
1961 OStringToOUString(aDesc.subView(0, aDesc.getLength() - 4), eTextEncoding) );
1989 const css::datatransfer::DataFlavor& rFlavor,
2014 for( sal_uInt32
i = 0, nFormatCount =
GetFormatCount(); (
i < nFormatCount ) && !bRet; ++
i )
2016 if( SotClipboardFormatId::FILE_LIST ==
GetFormat(
i ) )
2022 if( aFlavor.MimeType.indexOf(
"text/uri-list" ) > -1 )
2024 OString aDiskString;
2026 while( xStm->ReadLine( aDiskString ) )
2027 if( !aDiskString.isEmpty() && aDiskString[0] !=
'#' )
2028 rFileList.
AppendFile( OStringToOUString(aDiskString, RTL_TEXTENCODING_UTF8) );
2046 return Sequence<sal_Int8>();
2053 const Any aAny =
GetAny(rFlavor, rDestDoc);
2054 Sequence<sal_Int8> aSeq;
2055 if (aAny.hasValue())
2071 Sequence<sal_Int8> aSeq =
GetSequence(rFlavor, OUString());
2073 if (aSeq.hasElements())
2076 rxStream->WriteBytes( aSeq.getConstArray(), aSeq.getLength() );
2077 rxStream->Seek( 0 );
2080 return aSeq.hasElements();
2094 Sequence<sal_Int8> aSeq =
GetSequence(rFlavor, rDestDoc);
2096 if (!aSeq.hasElements())
2111 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
2117 return mxImpl->mxClipboardListener->isListening();
2122 ::osl::MutexGuard aGuard(
mxImpl->maMutex);
2124 if (
mxImpl->mxClipboardListener.is())
2126 mxImpl->mxClipboardListener->dispose();
2127 mxImpl->mxClipboardListener.clear();
2135 if( rClipboard.is() )
2139 Reference< XTransferable > xTransferable( rClipboard->getContents() );
2141 if( xTransferable.is() )
2148 catch(
const css::uno::Exception& )
2158 DBG_ASSERT( pWindow,
"Window pointer is NULL" );
2160 Reference< XClipboard > xClipboard;
2173 if( xSelection.is() )
2179 Reference< XTransferable > xTransferable( xSelection->getContents() );
2181 if( xTransferable.is() )
2187 catch(
const css::uno::Exception& )
2196 const css::datatransfer::DataFlavor& rRequestFlavor )
2203 Reference< XMimeContentTypeFactory > xMimeFact = MimeContentTypeFactory::create( xContext );
2205 Reference< XMimeContentType > xRequestType1( xMimeFact->createMimeContentType( rInternalFlavor.MimeType ) );
2206 Reference< XMimeContentType > xRequestType2( xMimeFact->createMimeContentType( rRequestFlavor.MimeType ) );
2208 if( xRequestType1.is() && xRequestType2.is() )
2210 if( xRequestType1->getFullMediaType().equalsIgnoreAsciiCase( xRequestType2->getFullMediaType() ) )
2212 if( xRequestType1->getFullMediaType().equalsIgnoreAsciiCase(
"text/plain" ) )
2215 static const OUStringLiteral aCharsetString(
u"charset" );
2217 if( !xRequestType2->hasParameter( aCharsetString ) ||
2218 xRequestType2->getParameterValue( aCharsetString ).equalsIgnoreAsciiCase(
"utf-16" ) ||
2219 xRequestType2->getParameterValue( aCharsetString ).equalsIgnoreAsciiCase(
"unicode" ) )
2224 else if( xRequestType1->getFullMediaType().equalsIgnoreAsciiCase(
"application/x-openoffice" ) )
2227 static const OUStringLiteral aFormatString(
u"windows_formatname" );
2229 if( xRequestType1->hasParameter( aFormatString ) &&
2230 xRequestType2->hasParameter( aFormatString ) &&
2231 xRequestType1->getParameterValue( aFormatString ).equalsIgnoreAsciiCase( xRequestType2->getParameterValue( aFormatString ) ) )
2241 catch(
const css::uno::Exception& )
2243 bRet = rInternalFlavor.MimeType.equalsIgnoreAsciiCase( rRequestFlavor.MimeType );
bool GetGraphic(SotClipboardFormatId nFormat, Graphic &rGraphic)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override
bool SetINetImage(const INetImage &rINtImg, const css::datatransfer::DataFlavor &rFlavor)
css::uno::Reference< css::datatransfer::dnd::XDragSource > GetDragSource()
Point GetPointerPosPixel()
VCL_DLLPRIVATE void ImplFlush()
void Write(SvStream &rOStm) const
bool GetSotStorageStream(SotClipboardFormatId nFormat, tools::SvRef< SotTempStream > &rStreamRef)
ErrCode ImportGraphic(Graphic &rGraphic, const INetURLObject &rPath, sal_uInt16 nFormat=GRFILTER_FORMAT_DONTKNOW, sal_uInt16 *pDeterminedFormat=nullptr, GraphicFilterImportFlags nImportFlags=GraphicFilterImportFlags::NONE)
css::uno::Reference< css::frame::XTerminateListener > mxTerminateListener
css::uno::Any GetAny(SotClipboardFormatId nFormat, const OUString &rDestDoc) const
bool SetBitmapEx(const BitmapEx &rBitmap, const css::datatransfer::DataFlavor &rFlavor)
void readGraphic(Graphic &rGraphic)
~TransferableDataHelper()
void setWidth(tools::Long nWidth)
SvStream & WriteInt32(sal_Int32 nInt32)
virtual sal_Bool SAL_CALL isDataFlavorSupported(const css::datatransfer::DataFlavor &rFlavor) override
const MapMode & GetPrefMapMode() const
Point LogicToLogic(const Point &rPtSource, const MapMode *pMapModeSource, const MapMode *pMapModeDest) const
virtual void SAL_CALL dragOver(const css::datatransfer::dnd::DragSourceDragEvent &dsde) override
virtual void AddSupportedFormats()=0
css::uno::Reference< css::datatransfer::clipboard::XClipboard > GetClipboard()
Bitmap const & GetBitmap() const
void Rebind(const css::uno::Reference< css::datatransfer::XTransferable > &_rxNewData)
::std::vector< DataFlavorEx > DataFlavorExVector
void SetPrefMapMode(const MapMode &rPrefMapMode)
bool ConvertGDIMetaFileToWMF(const GDIMetaFile &rMTF, SvStream &rTargetStream, FilterConfigItem const *pConfigItem, bool bPlaceable)
bool SetTransferableObjectDescriptor(const TransferableObjectDescriptor &rDesc)
bool HasFormat(SotClipboardFormatId nFormat)
DataFlavorExVector maFormats
#define STREAM_SEEK_TO_END
sal_uInt64 Seek(sal_uInt64 nPos)
Class to import and export graphic formats.
SotClipboardFormatId GetFormat(sal_uInt32 nFormat) const
virtual void DragFinished(sal_Int8 nDropAction)
bool GetINetBookmark(SotClipboardFormatId nFormat, INetBookmark &rBmk)
virtual sal_Bool SAL_CALL isComplex() override
bool HasFormat(SotClipboardFormatId nFormat) const
static TransferableDataHelper CreateFromPrimarySelection()
sal_uInt64 SeekRel(sal_Int64 nPos)
bool SetINetBookmark(const INetBookmark &rBmk, const css::datatransfer::DataFlavor &rFlavor)
bool SetObject(void *pUserObject, sal_uInt32 nUserObjectId, const css::datatransfer::DataFlavor &rFlavor)
virtual sal_uInt64 TellEnd() override
void AddFormat(SotClipboardFormatId nFormat)
constexpr tools::Long Width() const
SvStream & WriteTransferableObjectDescriptor(SvStream &rOStm, const TransferableObjectDescriptor &rObjDesc)
virtual ~TerminateListener() override
virtual OUString SAL_CALL getImplementationName() override
static std::unique_ptr< SvStream > CreateStream(const OUString &rFileName, StreamMode eOpenMode, css::uno::Reference< css::awt::XWindow > xParentWin=nullptr)
DataFlavorExVector maFormats
const Size & GetPrefSize() const
A helper class that calls Application::ReleaseSolarMutex() in its constructor and restores the mutex ...
IntrinsicAnimationEventHandlerSharedPtr mpListener
SvStream & WriteUniOrByteString(const OUString &rStr, rtl_TextEncoding eDestCharSet)
static TransferableDataHelper CreateFromSystemClipboard(vcl::Window *pWindow)
const GDIMetaFile & GetGDIMetaFile() const
SvStream & WriteUInt32(sal_uInt32 nUInt32)
virtual css::uno::Any SAL_CALL getTransferData2(const css::datatransfer::DataFlavor &rFlavor, const OUString &rDestDoc) override
TransferableDataHelper & operator=(const TransferableDataHelper &rDataHelper)
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual bool WriteObject(tools::SvRef< SotTempStream > &rxOStm, void *pUserObject, sal_uInt32 nUserObjectId, const css::datatransfer::DataFlavor &rFlavor)
OString OUStringToOString(std::u16string_view str, ConnectionSettings const *settings)
std::unique_ptr< TransferableDataHelper_Impl > mxImpl
std::unique_ptr< TransferableObjectDescriptor > mxObjDesc
virtual void SAL_CALL dragEnter(const css::datatransfer::dnd::DragSourceDragEvent &dsde) override
virtual void SAL_CALL dropActionChanged(const css::datatransfer::dnd::DragSourceDragEvent &dsde) override
static void ImplSetParameterString(TransferableObjectDescriptor &rObjDesc, const DataFlavorEx &rFlavorEx)
static bool IsEqual(const css::datatransfer::DataFlavor &rInternalFlavor, const css::datatransfer::DataFlavor &rRequestFlavor)
bool SetGraphic(const Graphic &rGraphic)
bool GetINetImage(SotClipboardFormatId nFormat, INetImage &rINtImg)
void RemoveFormat(SotClipboardFormatId nFormat)
#define DBG_ASSERT(sCon, aError)
css::datatransfer::DataFlavor GetFormatDataFlavor(sal_uInt32 nFormat) const
TerminateListener(TransferableHelper &rDropTargetHelper)
GraphicType GetType() const
OUString GetHexName() const
#define STREAM_SEEK_TO_BEGIN
css::uno::Reference< css::datatransfer::XTransferable > GetXTransferable() const
virtual void SAL_CALL queryTermination(const css::lang::EventObject &aEvent) override
bool GetString(SotClipboardFormatId nFormat, OUString &rStr)
static const css::uno::Sequence< sal_Int8 > & getUnoTunnelId()
SvStream & ReadFileList(SvStream &rIStm, FileList &rFileList)
virtual sal_Bool SAL_CALL supportsService(const OUString &sServiceName) override
virtual void SAL_CALL notifyTermination(const css::lang::EventObject &aEvent) override
sal_uInt32 GetFormatCount() const
bool Write(SvStream &rStream)
const OUString & GetDescription() const
void PrepareOLE(const TransferableObjectDescriptor &rObjDesc)
bool IsMouseCaptured() const
void StartDrag(vcl::Window *pWindow, sal_Int8 nDragSourceActions)
BitmapEx GetBitmapEx(const GraphicConversionParameters &rParameters=GraphicConversionParameters()) const
void CopyToClipboard(const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &rClipboard) const
void SetVersion(sal_Int32 n)
void AppendFile(const OUString &rStr)
std::unique_ptr< TransferableObjectDescriptor > mxObjDesc
static ErrCode Import(SvStream &rIStm, Graphic &rGraphic, ConvertDataFormat nFormat=ConvertDataFormat::Unknown)
virtual void SAL_CALL dragExit(const css::datatransfer::dnd::DragSourceEvent &dse) override
exports com.sun.star.chart2. data
virtual void SAL_CALL dragDropEnd(const css::datatransfer::dnd::DragSourceDropEvent &dsde) override
bool GetImageMap(SotClipboardFormatId nFormat, ImageMap &rIMap)
virtual void SAL_CALL lostOwnership(const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &xClipboard, const css::uno::Reference< css::datatransfer::XTransferable > &xTrans) override
Bitmap GetBitmap(Color aTransparentReplaceColor) const
virtual sal_Int64 SAL_CALL getSomething(const css::uno::Sequence< sal_Int8 > &rId) override
bool GetGDIMetaFile(SotClipboardFormatId nFormat, GDIMetaFile &rMtf, size_t nMaxActions=0)
Return as GDI metafile.
virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors() override
static ErrCode Export(SvStream &rOStm, const Graphic &rGraphic, ConvertDataFormat nFormat)
static SotClipboardFormatId RegisterFormat(const css::datatransfer::DataFlavor &rFlavor)
bool SetImageMap(const ImageMap &rIMap)
css::uno::Reference< css::datatransfer::clipboard::XClipboard > mxClipboard
void CopyToPrimarySelection() const
static SotClipboardFormatId GetFormat(const css::datatransfer::DataFlavor &rFlavor)
static void FillDataFlavorExVector(const css::uno::Sequence< css::datatransfer::DataFlavor > &rDataFlavorSeq, DataFlavorExVector &rDataFlavorExVector)
bool StartClipboardListening()
bool equalsIgnoreAsciiCase(std::u16string_view s1, std::u16string_view s2)
constexpr tools::Long Height() const
void Read(SvStream &rIStm)
SvStream & ReadGDIMetaFile(SvStream &rIStm, GDIMetaFile &rGDIMetaFile, ImplMetaReadData *pData)
#define SAL_INFO(area, stream)
virtual void ObjectReleased()
SvStream & WriteSvGlobalName(SvStream &rOStr, const SvGlobalName &rObj)
bool GetBitmapEx(SotClipboardFormatId nFormat, BitmapEx &rBmp)
css::uno::Reference< css::io::XInputStream > GetInputStream(SotClipboardFormatId nFormat, const OUString &rDestDoc)
void SetPrefSize(const Size &rPrefSize)
bool GetFileList(SotClipboardFormatId nFormat, FileList &rFileList)
Reference< XComponentContext > getProcessComponentContext()
const OUString & GetURL() const
Sequence< sal_Int8 > aSeq
void StopClipboardListening()
css::uno::Reference< css::datatransfer::XTransferable > mxTransfer
TransferableDataHelper_Impl()
void setHeight(tools::Long nHeight)
static GraphicFilter & GetGraphicFilter()
bool GetTransferableObjectDescriptor(SotClipboardFormatId nFormat, TransferableObjectDescriptor &rDesc)
void CopyToSelection(const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &rClipboard) const
css::uno::Reference< css::datatransfer::clipboard::XClipboard > mxClipboard
static TransferableDataHelper CreateFromClipboard(const css::uno::Reference< css::datatransfer::clipboard::XClipboard > &rClipboard)
SotClipboardFormatId mnSotId
void SetCompressMode(SvStreamCompressFlags nNewMode)
bool Read(SvStream &rIStm, SotClipboardFormatId nFormat)
bool SetAny(const css::uno::Any &rAny)
const css::uno::Sequence< sal_Int8 > & getSeq() const
void writeGraphic(const Graphic &rGraphic)
static void ClearPrimarySelection()
BaseContainerNodeSharedPtr & mrParent
bool SetString(const OUString &rString, const css::datatransfer::DataFlavor &rFlavor)
void Write(SvStream &rOStm, SotClipboardFormatId nFormat) const
static OUString ImplGetParameterString(const TransferableObjectDescriptor &rObjDesc)
css::uno::Sequence< sal_Int8 > GetSequence(SotClipboardFormatId nFormat, const OUString &rDestDoc)
bool MakeId(const OUString &rId)
virtual css::uno::Any SAL_CALL getTransferData(const css::datatransfer::DataFlavor &rFlavor) override
rtl::Reference< TransferableClipboardNotifier > mxClipboardListener
bool SetGDIMetaFile(const GDIMetaFile &rMtf)
Reference< XClipboard > GetSystemPrimarySelection()
virtual bool GetData(const css::datatransfer::DataFlavor &rFlavor, const OUString &rDestDoc)=0
static bool GetFormatDataFlavor(SotClipboardFormatId nFormat, css::datatransfer::DataFlavor &rFlavor)
virtual void SAL_CALL disposing(const css::lang::EventObject &Source) override