15900e8ecSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 35900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 45900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file 55900e8ecSAndrew Rist * distributed with this work for additional information 65900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file 75900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the 85900e8ecSAndrew Rist * "License"); you may not use this file except in compliance 95900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at 105900e8ecSAndrew Rist * 115900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 125900e8ecSAndrew Rist * 135900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing, 145900e8ecSAndrew Rist * software distributed under the License is distributed on an 155900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 165900e8ecSAndrew Rist * KIND, either express or implied. See the License for the 175900e8ecSAndrew Rist * specific language governing permissions and limitations 185900e8ecSAndrew Rist * under the License. 195900e8ecSAndrew Rist * 205900e8ecSAndrew Rist *************************************************************/ 215900e8ecSAndrew Rist 22cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 23cdf0e10cSrcweir #include "precompiled_svtools.hxx" 24cdf0e10cSrcweir #ifdef WNT 25cdf0e10cSrcweir #include <tools/prewin.h> 26cdf0e10cSrcweir #if defined _MSC_VER 27cdf0e10cSrcweir #pragma warning(push, 1) 28cdf0e10cSrcweir #pragma warning(disable: 4917) 29cdf0e10cSrcweir #endif 30cdf0e10cSrcweir #include <shlobj.h> 31cdf0e10cSrcweir #if defined _MSC_VER 32cdf0e10cSrcweir #pragma warning(pop) 33cdf0e10cSrcweir #endif 34cdf0e10cSrcweir #include <tools/postwin.h> 35cdf0e10cSrcweir #endif 36cdf0e10cSrcweir #include <vos/mutex.hxx> 37cdf0e10cSrcweir #include <rtl/memory.h> 38cdf0e10cSrcweir #include <rtl/uuid.h> 39cdf0e10cSrcweir #include <rtl/uri.hxx> 40cdf0e10cSrcweir #include <tools/debug.hxx> 41cdf0e10cSrcweir #include <tools/urlobj.hxx> 42cdf0e10cSrcweir #include <unotools/ucbstreamhelper.hxx> 43cdf0e10cSrcweir #include <sot/exchange.hxx> 44cdf0e10cSrcweir #include <sot/storage.hxx> 45cdf0e10cSrcweir #include <vcl/bitmap.hxx> 46cdf0e10cSrcweir #include <vcl/gdimtf.hxx> 47cdf0e10cSrcweir #include <vcl/graph.hxx> 48cdf0e10cSrcweir #include <vcl/cvtgrf.hxx> 49cdf0e10cSrcweir #include <vcl/svapp.hxx> 50cdf0e10cSrcweir #include <vcl/window.hxx> 51cdf0e10cSrcweir #include <comphelper/processfactory.hxx> 52cdf0e10cSrcweir #include <sot/filelist.hxx> 53cdf0e10cSrcweir #include <cppuhelper/implbase1.hxx> 54cdf0e10cSrcweir 55cdf0e10cSrcweir #include <comphelper/seqstream.hxx> 56cdf0e10cSrcweir #include <com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp> 57cdf0e10cSrcweir #include <com/sun/star/datatransfer/clipboard/XFlushableClipboard.hpp> 58cdf0e10cSrcweir #include <com/sun/star/datatransfer/XMimeContentTypeFactory.hpp> 59cdf0e10cSrcweir #include <com/sun/star/datatransfer/XMimeContentType.hpp> 60cdf0e10cSrcweir #include <com/sun/star/frame/XDesktop.hpp> 61cdf0e10cSrcweir #include <com/sun/star/lang/XInitialization.hpp> 62cdf0e10cSrcweir 63cdf0e10cSrcweir #include "svl/urlbmk.hxx" 64cdf0e10cSrcweir #include "inetimg.hxx" 65cdf0e10cSrcweir #include <svtools/wmf.hxx> 66cdf0e10cSrcweir #include <svtools/imap.hxx> 67cdf0e10cSrcweir #include <svtools/transfer.hxx> 68cdf0e10cSrcweir #include <cstdio> 69*45fd3b9aSArmin Le Grand #include <vcl/dibtools.hxx> 70*45fd3b9aSArmin Le Grand #include <vcl/pngread.hxx> 71*45fd3b9aSArmin Le Grand #include <vcl/pngwrite.hxx> 72cdf0e10cSrcweir 73cdf0e10cSrcweir // -------------- 74cdf0e10cSrcweir // - Namespaces - 75cdf0e10cSrcweir // -------------- 76cdf0e10cSrcweir 77cdf0e10cSrcweir using namespace ::com::sun::star::uno; 78cdf0e10cSrcweir using namespace ::com::sun::star::lang; 79cdf0e10cSrcweir using namespace ::com::sun::star::frame; 80cdf0e10cSrcweir using namespace ::com::sun::star::io; 81cdf0e10cSrcweir using namespace ::com::sun::star::datatransfer; 82cdf0e10cSrcweir using namespace ::com::sun::star::datatransfer::clipboard; 83cdf0e10cSrcweir using namespace ::com::sun::star::datatransfer::dnd; 84cdf0e10cSrcweir 85cdf0e10cSrcweir // -------------------------------- 86cdf0e10cSrcweir // - TransferableObjectDescriptor - 87cdf0e10cSrcweir // -------------------------------- 88cdf0e10cSrcweir 89cdf0e10cSrcweir #define TOD_SIG1 0x01234567 90cdf0e10cSrcweir #define TOD_SIG2 0x89abcdef 91cdf0e10cSrcweir 92cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, TransferableObjectDescriptor& rObjDesc ) 93cdf0e10cSrcweir { 94cdf0e10cSrcweir sal_uInt32 nSize, nViewAspect, nSig1, nSig2; 95cdf0e10cSrcweir 96cdf0e10cSrcweir rIStm >> nSize; 97cdf0e10cSrcweir rIStm >> rObjDesc.maClassName; 98cdf0e10cSrcweir rIStm >> nViewAspect; 99cdf0e10cSrcweir rIStm >> rObjDesc.maSize.Width(); 100cdf0e10cSrcweir rIStm >> rObjDesc.maSize.Height(); 101cdf0e10cSrcweir rIStm >> rObjDesc.maDragStartPos.X(); 102cdf0e10cSrcweir rIStm >> rObjDesc.maDragStartPos.Y(); 103cdf0e10cSrcweir rIStm.ReadByteString( rObjDesc.maTypeName, gsl_getSystemTextEncoding() ); 104cdf0e10cSrcweir rIStm.ReadByteString( rObjDesc.maDisplayName, gsl_getSystemTextEncoding() ); 105cdf0e10cSrcweir rIStm >> nSig1 >> nSig2; 106cdf0e10cSrcweir 107cdf0e10cSrcweir rObjDesc.mnViewAspect = static_cast< sal_uInt16 >( nViewAspect ); 108cdf0e10cSrcweir 109cdf0e10cSrcweir // don't use width/height info from external objects 110cdf0e10cSrcweir if( ( TOD_SIG1 != nSig1 ) || ( TOD_SIG2 != nSig2 ) ) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir rObjDesc.maSize.Width() = 0; 113cdf0e10cSrcweir rObjDesc.maSize.Height() = 0; 114cdf0e10cSrcweir } 115cdf0e10cSrcweir 116cdf0e10cSrcweir return rIStm; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir 119cdf0e10cSrcweir // ----------------------------------------------------------------------------- 120cdf0e10cSrcweir 121cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const TransferableObjectDescriptor& rObjDesc ) 122cdf0e10cSrcweir { 123cdf0e10cSrcweir const sal_uInt32 nFirstPos = rOStm.Tell(), nViewAspect = rObjDesc.mnViewAspect; 124cdf0e10cSrcweir const sal_uInt32 nSig1 = TOD_SIG1, nSig2 = TOD_SIG2; 125cdf0e10cSrcweir 126cdf0e10cSrcweir rOStm.SeekRel( 4 ); 127cdf0e10cSrcweir rOStm << rObjDesc.maClassName; 128cdf0e10cSrcweir rOStm << nViewAspect; 129cdf0e10cSrcweir rOStm << rObjDesc.maSize.Width(); 130cdf0e10cSrcweir rOStm << rObjDesc.maSize.Height(); 131cdf0e10cSrcweir rOStm << rObjDesc.maDragStartPos.X(); 132cdf0e10cSrcweir rOStm << rObjDesc.maDragStartPos.Y(); 133cdf0e10cSrcweir rOStm.WriteByteString( rObjDesc.maTypeName, gsl_getSystemTextEncoding() ); 134cdf0e10cSrcweir rOStm.WriteByteString( rObjDesc.maDisplayName, gsl_getSystemTextEncoding() ); 135cdf0e10cSrcweir rOStm << nSig1 << nSig2; 136cdf0e10cSrcweir 137cdf0e10cSrcweir const sal_uInt32 nLastPos = rOStm.Tell(); 138cdf0e10cSrcweir 139cdf0e10cSrcweir rOStm.Seek( nFirstPos ); 140cdf0e10cSrcweir rOStm << ( nLastPos - nFirstPos ); 141cdf0e10cSrcweir rOStm.Seek( nLastPos ); 142cdf0e10cSrcweir 143cdf0e10cSrcweir return rOStm; 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir // ----------------------------------------------------------------------------- 147cdf0e10cSrcweir // the reading of the parameter is done using the special service ::com::sun::star::datatransfer::MimeContentType, 148cdf0e10cSrcweir // a similar approach should be implemented for creation of the mimetype string; 149cdf0e10cSrcweir // for now the set of acceptable characters has to be hardcoded, in future it should be part of the service that creates the mimetype 1508178a74eSMathias Bauer const ::rtl::OUString aQuotedParamChars = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "()<>@,;:/[]?=!#$&'*+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz{|}~. " ) ); 151cdf0e10cSrcweir 152cdf0e10cSrcweir static ::rtl::OUString ImplGetParameterString( const TransferableObjectDescriptor& rObjDesc ) 153cdf0e10cSrcweir { 154cdf0e10cSrcweir const ::rtl::OUString aChar( ::rtl::OUString::createFromAscii( "\"" ) ); 155cdf0e10cSrcweir const ::rtl::OUString aClassName( rObjDesc.maClassName.GetHexName() ); 156cdf0e10cSrcweir ::rtl::OUString aParams; 157cdf0e10cSrcweir 158cdf0e10cSrcweir if( aClassName.getLength() ) 159cdf0e10cSrcweir { 160cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";classname=\"" ); 161cdf0e10cSrcweir aParams += aClassName; 162cdf0e10cSrcweir aParams += aChar; 163cdf0e10cSrcweir } 164cdf0e10cSrcweir 165cdf0e10cSrcweir if( rObjDesc.maTypeName.Len() ) 166cdf0e10cSrcweir { 167cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";typename=\"" ); 168cdf0e10cSrcweir aParams += rObjDesc.maTypeName; 169cdf0e10cSrcweir aParams += aChar; 170cdf0e10cSrcweir } 171cdf0e10cSrcweir 172cdf0e10cSrcweir if( rObjDesc.maDisplayName.Len() ) 173cdf0e10cSrcweir { 174cdf0e10cSrcweir // the display name might contain unacceptable characters, encode all of them 175cdf0e10cSrcweir // this seems to be the only parameter currently that might contain such characters 176cdf0e10cSrcweir sal_Bool pToAccept[128]; 177cdf0e10cSrcweir for ( sal_Int32 nBInd = 0; nBInd < 128; nBInd++ ) 178cdf0e10cSrcweir pToAccept[nBInd] = sal_False; 179cdf0e10cSrcweir 180cdf0e10cSrcweir for ( sal_Int32 nInd = 0; nInd < aQuotedParamChars.getLength(); nInd++ ) 181cdf0e10cSrcweir { 182cdf0e10cSrcweir sal_Unicode nChar = aQuotedParamChars.getStr()[nInd]; 183cdf0e10cSrcweir if ( nChar < 128 ) 184cdf0e10cSrcweir pToAccept[nChar] = sal_True; 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";displayname=\"" ); 188cdf0e10cSrcweir aParams += ::rtl::Uri::encode( rObjDesc.maDisplayName, pToAccept, rtl_UriEncodeIgnoreEscapes, RTL_TEXTENCODING_UTF8 ); 189cdf0e10cSrcweir aParams += aChar; 190cdf0e10cSrcweir } 191cdf0e10cSrcweir 192cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";viewaspect=\"" ); 193cdf0e10cSrcweir aParams += ::rtl::OUString::valueOf( static_cast< sal_Int32 >( rObjDesc.mnViewAspect ) ); 194cdf0e10cSrcweir aParams += aChar; 195cdf0e10cSrcweir 196cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";width=\"" ); 197cdf0e10cSrcweir aParams += ::rtl::OUString::valueOf( rObjDesc.maSize.Width() ); 198cdf0e10cSrcweir aParams += aChar; 199cdf0e10cSrcweir 200cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";height=\"" ); 201cdf0e10cSrcweir aParams += ::rtl::OUString::valueOf( rObjDesc.maSize.Height() ); 202cdf0e10cSrcweir aParams += aChar; 203cdf0e10cSrcweir 204cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";posx=\"" ); 205cdf0e10cSrcweir aParams += ::rtl::OUString::valueOf( rObjDesc.maDragStartPos.X() ); 206cdf0e10cSrcweir aParams += aChar; 207cdf0e10cSrcweir 208cdf0e10cSrcweir aParams += ::rtl::OUString::createFromAscii( ";posy=\"" ); 209cdf0e10cSrcweir aParams += ::rtl::OUString::valueOf( rObjDesc.maDragStartPos.X() ); 210cdf0e10cSrcweir aParams += aChar; 211cdf0e10cSrcweir 212cdf0e10cSrcweir return aParams; 213cdf0e10cSrcweir } 214cdf0e10cSrcweir 215cdf0e10cSrcweir // ----------------------------------------------------------------------------- 216cdf0e10cSrcweir 217cdf0e10cSrcweir static void ImplSetParameterString( TransferableObjectDescriptor& rObjDesc, const DataFlavorEx& rFlavorEx ) 218cdf0e10cSrcweir { 219cdf0e10cSrcweir Reference< XMultiServiceFactory > xFact( ::comphelper::getProcessServiceFactory() ); 220cdf0e10cSrcweir Reference< XMimeContentTypeFactory > xMimeFact; 221cdf0e10cSrcweir 222cdf0e10cSrcweir try 223cdf0e10cSrcweir { 224cdf0e10cSrcweir if( xFact.is() ) 225cdf0e10cSrcweir { 226cdf0e10cSrcweir xMimeFact = Reference< XMimeContentTypeFactory >( xFact->createInstance( ::rtl::OUString::createFromAscii( 227cdf0e10cSrcweir "com.sun.star.datatransfer.MimeContentTypeFactory" ) ), 228cdf0e10cSrcweir UNO_QUERY ); 229cdf0e10cSrcweir } 230cdf0e10cSrcweir 231cdf0e10cSrcweir if( xMimeFact.is() ) 232cdf0e10cSrcweir { 233cdf0e10cSrcweir Reference< XMimeContentType > xMimeType( xMimeFact->createMimeContentType( rFlavorEx.MimeType ) ); 234cdf0e10cSrcweir 235cdf0e10cSrcweir if( xMimeType.is() ) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir const ::rtl::OUString aClassNameString( ::rtl::OUString::createFromAscii( "classname" ) ); 238cdf0e10cSrcweir const ::rtl::OUString aTypeNameString( ::rtl::OUString::createFromAscii( "typename" ) ); 239cdf0e10cSrcweir const ::rtl::OUString aDisplayNameString( ::rtl::OUString::createFromAscii( "displayname" ) ); 240cdf0e10cSrcweir const ::rtl::OUString aViewAspectString( ::rtl::OUString::createFromAscii( "viewaspect" ) ); 241cdf0e10cSrcweir const ::rtl::OUString aWidthString( ::rtl::OUString::createFromAscii( "width" ) ); 242cdf0e10cSrcweir const ::rtl::OUString aHeightString( ::rtl::OUString::createFromAscii( "height" ) ); 243cdf0e10cSrcweir const ::rtl::OUString aPosXString( ::rtl::OUString::createFromAscii( "posx" ) ); 244cdf0e10cSrcweir const ::rtl::OUString aPosYString( ::rtl::OUString::createFromAscii( "posy" ) ); 245cdf0e10cSrcweir 246cdf0e10cSrcweir if( xMimeType->hasParameter( aClassNameString ) ) 247cdf0e10cSrcweir { 248cdf0e10cSrcweir rObjDesc.maClassName.MakeId( xMimeType->getParameterValue( aClassNameString ) ); 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir if( xMimeType->hasParameter( aTypeNameString ) ) 252cdf0e10cSrcweir { 253cdf0e10cSrcweir rObjDesc.maTypeName = xMimeType->getParameterValue( aTypeNameString ); 254cdf0e10cSrcweir } 255cdf0e10cSrcweir 256cdf0e10cSrcweir if( xMimeType->hasParameter( aDisplayNameString ) ) 257cdf0e10cSrcweir { 258cdf0e10cSrcweir // the display name might contain unacceptable characters, in this case they should be encoded 259cdf0e10cSrcweir // this seems to be the only parameter currently that might contain such characters 260cdf0e10cSrcweir rObjDesc.maDisplayName = ::rtl::Uri::decode( xMimeType->getParameterValue( aDisplayNameString ), rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8 ); 261cdf0e10cSrcweir } 262cdf0e10cSrcweir 263cdf0e10cSrcweir if( xMimeType->hasParameter( aViewAspectString ) ) 264cdf0e10cSrcweir { 265cdf0e10cSrcweir rObjDesc.mnViewAspect = static_cast< sal_uInt16 >( xMimeType->getParameterValue( aViewAspectString ).toInt32() ); 266cdf0e10cSrcweir } 267cdf0e10cSrcweir 268cdf0e10cSrcweir if( xMimeType->hasParameter( aWidthString ) ) 269cdf0e10cSrcweir { 270cdf0e10cSrcweir rObjDesc.maSize.Width() = xMimeType->getParameterValue( aWidthString ).toInt32(); 271cdf0e10cSrcweir } 272cdf0e10cSrcweir 273cdf0e10cSrcweir if( xMimeType->hasParameter( aHeightString ) ) 274cdf0e10cSrcweir { 275cdf0e10cSrcweir rObjDesc.maSize.Height() = xMimeType->getParameterValue( aHeightString ).toInt32(); 276cdf0e10cSrcweir } 277cdf0e10cSrcweir 278cdf0e10cSrcweir if( xMimeType->hasParameter( aPosXString ) ) 279cdf0e10cSrcweir { 280cdf0e10cSrcweir rObjDesc.maDragStartPos.X() = xMimeType->getParameterValue( aPosXString ).toInt32(); 281cdf0e10cSrcweir } 282cdf0e10cSrcweir 283cdf0e10cSrcweir if( xMimeType->hasParameter( aPosYString ) ) 284cdf0e10cSrcweir { 285cdf0e10cSrcweir rObjDesc.maDragStartPos.Y() = xMimeType->getParameterValue( aPosYString ).toInt32(); 286cdf0e10cSrcweir } 287cdf0e10cSrcweir } 288cdf0e10cSrcweir } 289cdf0e10cSrcweir } 290cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 291cdf0e10cSrcweir { 292cdf0e10cSrcweir } 293cdf0e10cSrcweir } 294cdf0e10cSrcweir 295cdf0e10cSrcweir // ----------------------------------------- 296cdf0e10cSrcweir // - TransferableHelper::TerminateListener - 297cdf0e10cSrcweir // ----------------------------------------- 298cdf0e10cSrcweir 299cdf0e10cSrcweir TransferableHelper::TerminateListener::TerminateListener( TransferableHelper& rTransferableHelper ) : 300cdf0e10cSrcweir mrParent( rTransferableHelper ) 301cdf0e10cSrcweir { 302cdf0e10cSrcweir } 303cdf0e10cSrcweir 304cdf0e10cSrcweir // ----------------------------------------------------------------------------- 305cdf0e10cSrcweir 306cdf0e10cSrcweir TransferableHelper::TerminateListener::~TerminateListener() 307cdf0e10cSrcweir { 308cdf0e10cSrcweir } 309cdf0e10cSrcweir 310cdf0e10cSrcweir // ----------------------------------------------------------------------------- 311cdf0e10cSrcweir 312cdf0e10cSrcweir void SAL_CALL TransferableHelper::TerminateListener::disposing( const EventObject& ) throw( RuntimeException ) 313cdf0e10cSrcweir { 314cdf0e10cSrcweir } 315cdf0e10cSrcweir 316cdf0e10cSrcweir // ----------------------------------------------------------------------------- 317cdf0e10cSrcweir 318cdf0e10cSrcweir void SAL_CALL TransferableHelper::TerminateListener::queryTermination( const EventObject& ) throw( TerminationVetoException, RuntimeException ) 319cdf0e10cSrcweir { 320cdf0e10cSrcweir } 321cdf0e10cSrcweir 322cdf0e10cSrcweir // ----------------------------------------------------------------------------- 323cdf0e10cSrcweir 324cdf0e10cSrcweir void SAL_CALL TransferableHelper::TerminateListener::notifyTermination( const EventObject& ) throw( RuntimeException ) 325cdf0e10cSrcweir { 326cdf0e10cSrcweir mrParent.ImplFlush(); 327cdf0e10cSrcweir } 328cdf0e10cSrcweir 329cdf0e10cSrcweir // ---------------------- 330cdf0e10cSrcweir // - TransferableHelper - 331cdf0e10cSrcweir // ---------------------- 332cdf0e10cSrcweir 333cdf0e10cSrcweir TransferableHelper::TransferableHelper() : 334cdf0e10cSrcweir mpFormats( new DataFlavorExVector ), 335cdf0e10cSrcweir mpObjDesc( NULL ) 336cdf0e10cSrcweir { 337cdf0e10cSrcweir } 338cdf0e10cSrcweir 339cdf0e10cSrcweir // ----------------------------------------------------------------------------- 340cdf0e10cSrcweir 341cdf0e10cSrcweir TransferableHelper::~TransferableHelper() 342cdf0e10cSrcweir { 343cdf0e10cSrcweir delete mpObjDesc; 344cdf0e10cSrcweir delete mpFormats; 345cdf0e10cSrcweir } 346cdf0e10cSrcweir 347cdf0e10cSrcweir // ----------------------------------------------------------------------------- 348cdf0e10cSrcweir 349cdf0e10cSrcweir Any SAL_CALL TransferableHelper::getTransferData( const DataFlavor& rFlavor ) throw( UnsupportedFlavorException, IOException, RuntimeException ) 350cdf0e10cSrcweir { 351cdf0e10cSrcweir if( !maAny.hasValue() || !mpFormats->size() || ( maLastFormat != rFlavor.MimeType ) ) 352cdf0e10cSrcweir { 353cdf0e10cSrcweir const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 354cdf0e10cSrcweir 355cdf0e10cSrcweir maLastFormat = rFlavor.MimeType; 356cdf0e10cSrcweir maAny = Any(); 357cdf0e10cSrcweir 358cdf0e10cSrcweir try 359cdf0e10cSrcweir { 360cdf0e10cSrcweir DataFlavor aSubstFlavor; 361cdf0e10cSrcweir sal_Bool bDone = sal_False; 362cdf0e10cSrcweir 363cdf0e10cSrcweir // add formats if not already done 364cdf0e10cSrcweir if( !mpFormats->size() ) 365cdf0e10cSrcweir AddSupportedFormats(); 366cdf0e10cSrcweir 367cdf0e10cSrcweir // check alien formats first and try to get a substitution format 368cdf0e10cSrcweir if( SotExchange::GetFormatDataFlavor( FORMAT_STRING, aSubstFlavor ) && 369cdf0e10cSrcweir TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) ) 370cdf0e10cSrcweir { 371cdf0e10cSrcweir GetData( aSubstFlavor ); 372cdf0e10cSrcweir bDone = maAny.hasValue(); 373cdf0e10cSrcweir } 374*45fd3b9aSArmin Le Grand else if(SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_BMP, aSubstFlavor ) 375*45fd3b9aSArmin Le Grand && TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) 376*45fd3b9aSArmin Le Grand && SotExchange::GetFormatDataFlavor(FORMAT_BITMAP, aSubstFlavor)) 377cdf0e10cSrcweir { 378cdf0e10cSrcweir GetData( aSubstFlavor ); 379cdf0e10cSrcweir bDone = sal_True; 380cdf0e10cSrcweir } 381cdf0e10cSrcweir else if( SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_EMF, aSubstFlavor ) && 382cdf0e10cSrcweir TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) && 383cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( FORMAT_GDIMETAFILE, aSubstFlavor ) ) 384cdf0e10cSrcweir { 385cdf0e10cSrcweir GetData( aSubstFlavor ); 386cdf0e10cSrcweir 387cdf0e10cSrcweir if( maAny.hasValue() ) 388cdf0e10cSrcweir { 389cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 390cdf0e10cSrcweir 391cdf0e10cSrcweir if( maAny >>= aSeq ) 392cdf0e10cSrcweir { 393cdf0e10cSrcweir SvMemoryStream* pSrcStm = new SvMemoryStream( (char*) aSeq.getConstArray(), aSeq.getLength(), STREAM_WRITE | STREAM_TRUNC ); 394cdf0e10cSrcweir GDIMetaFile aMtf; 395cdf0e10cSrcweir 396cdf0e10cSrcweir *pSrcStm >> aMtf; 397cdf0e10cSrcweir delete pSrcStm; 398cdf0e10cSrcweir 399cdf0e10cSrcweir Graphic aGraphic( aMtf ); 400cdf0e10cSrcweir SvMemoryStream aDstStm( 65535, 65535 ); 401cdf0e10cSrcweir 402cdf0e10cSrcweir if( GraphicConverter::Export( aDstStm, aGraphic, CVT_EMF ) == ERRCODE_NONE ) 403cdf0e10cSrcweir { 404cdf0e10cSrcweir maAny <<= ( aSeq = Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aDstStm.GetData() ), 405cdf0e10cSrcweir aDstStm.Seek( STREAM_SEEK_TO_END ) ) ); 406cdf0e10cSrcweir bDone = sal_True; 407cdf0e10cSrcweir } 408cdf0e10cSrcweir } 409cdf0e10cSrcweir } 410cdf0e10cSrcweir } 411cdf0e10cSrcweir else if( SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_WMF, aSubstFlavor ) && 412cdf0e10cSrcweir TransferableDataHelper::IsEqual( aSubstFlavor, rFlavor ) && 413cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( FORMAT_GDIMETAFILE, aSubstFlavor ) ) 414cdf0e10cSrcweir { 415cdf0e10cSrcweir GetData( aSubstFlavor ); 416cdf0e10cSrcweir 417cdf0e10cSrcweir if( maAny.hasValue() ) 418cdf0e10cSrcweir { 419cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 420cdf0e10cSrcweir 421cdf0e10cSrcweir if( maAny >>= aSeq ) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir SvMemoryStream* pSrcStm = new SvMemoryStream( (char*) aSeq.getConstArray(), aSeq.getLength(), STREAM_WRITE | STREAM_TRUNC ); 424cdf0e10cSrcweir GDIMetaFile aMtf; 425cdf0e10cSrcweir 426cdf0e10cSrcweir *pSrcStm >> aMtf; 427cdf0e10cSrcweir delete pSrcStm; 428cdf0e10cSrcweir 429cdf0e10cSrcweir SvMemoryStream aDstStm( 65535, 65535 ); 430cdf0e10cSrcweir 431cdf0e10cSrcweir // taking wmf without file header 432cdf0e10cSrcweir if ( ConvertGDIMetaFileToWMF( aMtf, aDstStm, NULL, sal_False ) ) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir maAny <<= ( aSeq = Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aDstStm.GetData() ), 435cdf0e10cSrcweir aDstStm.Seek( STREAM_SEEK_TO_END ) ) ); 436cdf0e10cSrcweir bDone = sal_True; 437cdf0e10cSrcweir } 438cdf0e10cSrcweir } 439cdf0e10cSrcweir } 440cdf0e10cSrcweir } 441cdf0e10cSrcweir 442cdf0e10cSrcweir // reset Any if substitute doesn't work 443cdf0e10cSrcweir if( !bDone && maAny.hasValue() ) 444cdf0e10cSrcweir maAny = Any(); 445cdf0e10cSrcweir 446cdf0e10cSrcweir // if any is not yet filled, use standard format 447cdf0e10cSrcweir if( !maAny.hasValue() ) 448cdf0e10cSrcweir GetData( rFlavor ); 449cdf0e10cSrcweir 450cdf0e10cSrcweir #ifdef DEBUG 451cdf0e10cSrcweir if( maAny.hasValue() && ::com::sun::star::uno::TypeClass_STRING != maAny.getValueType().getTypeClass() ) 452cdf0e10cSrcweir fprintf( stderr, "TransferableHelper delivers sequence of data [ %s ]\n", ByteString( String( rFlavor.MimeType), RTL_TEXTENCODING_ASCII_US ).GetBuffer() ); 453cdf0e10cSrcweir #endif 454cdf0e10cSrcweir } 455cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 456cdf0e10cSrcweir { 457cdf0e10cSrcweir } 458cdf0e10cSrcweir 459cdf0e10cSrcweir if( !maAny.hasValue() ) 460cdf0e10cSrcweir throw UnsupportedFlavorException(); 461cdf0e10cSrcweir } 462cdf0e10cSrcweir 463cdf0e10cSrcweir return maAny; 464cdf0e10cSrcweir } 465cdf0e10cSrcweir 466cdf0e10cSrcweir // ----------------------------------------------------------------------------- 467cdf0e10cSrcweir 468cdf0e10cSrcweir Sequence< DataFlavor > SAL_CALL TransferableHelper::getTransferDataFlavors() throw( RuntimeException ) 469cdf0e10cSrcweir { 470cdf0e10cSrcweir const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 471cdf0e10cSrcweir 472cdf0e10cSrcweir try 473cdf0e10cSrcweir { 474cdf0e10cSrcweir if( !mpFormats->size() ) 475cdf0e10cSrcweir AddSupportedFormats(); 476cdf0e10cSrcweir } 477cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 478cdf0e10cSrcweir { 479cdf0e10cSrcweir } 480cdf0e10cSrcweir 481cdf0e10cSrcweir Sequence< DataFlavor > aRet( mpFormats->size() ); 482cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 483cdf0e10cSrcweir sal_uInt32 nCurPos = 0; 484cdf0e10cSrcweir 485cdf0e10cSrcweir while( aIter != aEnd ) 486cdf0e10cSrcweir { 487cdf0e10cSrcweir aRet[ nCurPos++ ] = *aIter++; 488cdf0e10cSrcweir } 489cdf0e10cSrcweir 490cdf0e10cSrcweir return aRet; 491cdf0e10cSrcweir } 492cdf0e10cSrcweir 493cdf0e10cSrcweir // ----------------------------------------------------------------------------- 494cdf0e10cSrcweir 495cdf0e10cSrcweir sal_Bool SAL_CALL TransferableHelper::isDataFlavorSupported( const DataFlavor& rFlavor ) throw( RuntimeException ) 496cdf0e10cSrcweir { 497cdf0e10cSrcweir const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 498cdf0e10cSrcweir sal_Bool bRet = sal_False; 499cdf0e10cSrcweir 500cdf0e10cSrcweir try 501cdf0e10cSrcweir { 502cdf0e10cSrcweir if( !mpFormats->size() ) 503cdf0e10cSrcweir AddSupportedFormats(); 504cdf0e10cSrcweir } 505cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 506cdf0e10cSrcweir { 507cdf0e10cSrcweir } 508cdf0e10cSrcweir 509cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 510cdf0e10cSrcweir 511cdf0e10cSrcweir while( aIter != aEnd ) 512cdf0e10cSrcweir { 513cdf0e10cSrcweir if( TransferableDataHelper::IsEqual( *aIter, rFlavor ) ) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir aIter = aEnd; 516cdf0e10cSrcweir bRet = sal_True; 517cdf0e10cSrcweir } 518cdf0e10cSrcweir else 519cdf0e10cSrcweir aIter++; 520cdf0e10cSrcweir } 521cdf0e10cSrcweir 522cdf0e10cSrcweir return bRet; 523cdf0e10cSrcweir } 524cdf0e10cSrcweir 525cdf0e10cSrcweir // ----------------------------------------------------------------------------- 526cdf0e10cSrcweir 527cdf0e10cSrcweir void SAL_CALL TransferableHelper::lostOwnership( const Reference< XClipboard >&, const Reference< XTransferable >& ) throw( RuntimeException ) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 530cdf0e10cSrcweir 531cdf0e10cSrcweir try 532cdf0e10cSrcweir { 533cdf0e10cSrcweir if( mxTerminateListener.is() ) 534cdf0e10cSrcweir { 535cdf0e10cSrcweir Reference< XMultiServiceFactory > xFact( ::comphelper::getProcessServiceFactory() ); 536cdf0e10cSrcweir 537cdf0e10cSrcweir if( xFact.is() ) 538cdf0e10cSrcweir { 539cdf0e10cSrcweir Reference< XDesktop > xDesktop( xFact->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ), UNO_QUERY ); 540cdf0e10cSrcweir 541cdf0e10cSrcweir if( xDesktop.is() ) 542cdf0e10cSrcweir xDesktop->removeTerminateListener( mxTerminateListener ); 543cdf0e10cSrcweir } 544cdf0e10cSrcweir 545cdf0e10cSrcweir mxTerminateListener = Reference< XTerminateListener >(); 546cdf0e10cSrcweir } 547cdf0e10cSrcweir 548cdf0e10cSrcweir ObjectReleased(); 549cdf0e10cSrcweir } 550cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 551cdf0e10cSrcweir { 552cdf0e10cSrcweir } 553cdf0e10cSrcweir } 554cdf0e10cSrcweir 555cdf0e10cSrcweir // ----------------------------------------------------------------------------- 556cdf0e10cSrcweir 557cdf0e10cSrcweir void SAL_CALL TransferableHelper::disposing( const EventObject& ) throw( RuntimeException ) 558cdf0e10cSrcweir { 559cdf0e10cSrcweir } 560cdf0e10cSrcweir 561cdf0e10cSrcweir // ----------------------------------------------------------------------------- 562cdf0e10cSrcweir 563cdf0e10cSrcweir void SAL_CALL TransferableHelper::dragDropEnd( const DragSourceDropEvent& rDSDE ) throw( RuntimeException ) 564cdf0e10cSrcweir { 565cdf0e10cSrcweir const ::vos::OGuard aGuard( Application::GetSolarMutex() ); 566cdf0e10cSrcweir 567cdf0e10cSrcweir try 568cdf0e10cSrcweir { 569cdf0e10cSrcweir DragFinished( rDSDE.DropSuccess ? ( rDSDE.DropAction & ~DNDConstants::ACTION_DEFAULT ) : DNDConstants::ACTION_NONE ); 570cdf0e10cSrcweir ObjectReleased(); 571cdf0e10cSrcweir } 572cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 573cdf0e10cSrcweir { 574cdf0e10cSrcweir } 575cdf0e10cSrcweir } 576cdf0e10cSrcweir 577cdf0e10cSrcweir // ----------------------------------------------------------------------------- 578cdf0e10cSrcweir 579cdf0e10cSrcweir void SAL_CALL TransferableHelper::dragEnter( const DragSourceDragEvent& ) throw( RuntimeException ) 580cdf0e10cSrcweir { 581cdf0e10cSrcweir } 582cdf0e10cSrcweir 583cdf0e10cSrcweir // ----------------------------------------------------------------------------- 584cdf0e10cSrcweir 585cdf0e10cSrcweir void SAL_CALL TransferableHelper::dragExit( const DragSourceEvent& ) throw( RuntimeException ) 586cdf0e10cSrcweir { 587cdf0e10cSrcweir } 588cdf0e10cSrcweir 589cdf0e10cSrcweir // ----------------------------------------------------------------------------- 590cdf0e10cSrcweir 591cdf0e10cSrcweir void SAL_CALL TransferableHelper::dragOver( const DragSourceDragEvent& ) throw( RuntimeException ) 592cdf0e10cSrcweir { 593cdf0e10cSrcweir } 594cdf0e10cSrcweir 595cdf0e10cSrcweir // ----------------------------------------------------------------------------- 596cdf0e10cSrcweir 597cdf0e10cSrcweir void SAL_CALL TransferableHelper::dropActionChanged( const DragSourceDragEvent& ) throw( RuntimeException ) 598cdf0e10cSrcweir { 599cdf0e10cSrcweir } 600cdf0e10cSrcweir 601cdf0e10cSrcweir // ----------------------------------------------------------------------------- 602cdf0e10cSrcweir 603cdf0e10cSrcweir sal_Int64 SAL_CALL TransferableHelper::getSomething( const Sequence< sal_Int8 >& rId ) throw( RuntimeException ) 604cdf0e10cSrcweir { 605cdf0e10cSrcweir sal_Int64 nRet; 606cdf0e10cSrcweir 607cdf0e10cSrcweir if( ( rId.getLength() == 16 ) && 608cdf0e10cSrcweir ( 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), rId.getConstArray(), 16 ) ) ) 609cdf0e10cSrcweir { 610cdf0e10cSrcweir nRet = sal::static_int_cast<sal_Int64>(reinterpret_cast<sal_IntPtr>(this)); 611cdf0e10cSrcweir } 612cdf0e10cSrcweir else 613cdf0e10cSrcweir nRet = 0; 614cdf0e10cSrcweir 615cdf0e10cSrcweir return nRet; 616cdf0e10cSrcweir } 617cdf0e10cSrcweir 618cdf0e10cSrcweir // ----------------------------------------------------------------------------- 619cdf0e10cSrcweir 620cdf0e10cSrcweir void TransferableHelper::ImplFlush() 621cdf0e10cSrcweir { 622cdf0e10cSrcweir if( mxClipboard.is() ) 623cdf0e10cSrcweir { 624cdf0e10cSrcweir Reference< XFlushableClipboard > xFlushableClipboard( mxClipboard, UNO_QUERY ); 625cdf0e10cSrcweir const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 626cdf0e10cSrcweir 627cdf0e10cSrcweir try 628cdf0e10cSrcweir { 629cdf0e10cSrcweir if( xFlushableClipboard.is() ) 630cdf0e10cSrcweir xFlushableClipboard->flushClipboard(); 631cdf0e10cSrcweir } 632cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 633cdf0e10cSrcweir { 634cdf0e10cSrcweir DBG_ERROR( "Could not flush clipboard" ); 635cdf0e10cSrcweir } 636cdf0e10cSrcweir 637cdf0e10cSrcweir Application::AcquireSolarMutex( nRef ); 638cdf0e10cSrcweir } 639cdf0e10cSrcweir } 640cdf0e10cSrcweir 641cdf0e10cSrcweir // ----------------------------------------------------------------------------- 642cdf0e10cSrcweir 643cdf0e10cSrcweir void TransferableHelper::AddFormat( SotFormatStringId nFormat ) 644cdf0e10cSrcweir { 645cdf0e10cSrcweir DataFlavor aFlavor; 646cdf0e10cSrcweir 647cdf0e10cSrcweir if( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) ) 648cdf0e10cSrcweir AddFormat( aFlavor ); 649cdf0e10cSrcweir } 650cdf0e10cSrcweir 651cdf0e10cSrcweir // ----------------------------------------------------------------------------- 652cdf0e10cSrcweir 653cdf0e10cSrcweir void TransferableHelper::AddFormat( const DataFlavor& rFlavor ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 656cdf0e10cSrcweir sal_Bool bAdd = sal_True; 657cdf0e10cSrcweir 658cdf0e10cSrcweir while( aIter != aEnd ) 659cdf0e10cSrcweir { 660cdf0e10cSrcweir if( TransferableDataHelper::IsEqual( *aIter, rFlavor ) ) 661cdf0e10cSrcweir { 662cdf0e10cSrcweir // update MimeType for SOT_FORMATSTR_ID_OBJECTDESCRIPTOR in every case 663cdf0e10cSrcweir if( ( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR == aIter->mnSotId ) && mpObjDesc ) 664cdf0e10cSrcweir { 665cdf0e10cSrcweir DataFlavor aObjDescFlavor; 666cdf0e10cSrcweir 667cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR, aObjDescFlavor ); 668cdf0e10cSrcweir aIter->MimeType = aObjDescFlavor.MimeType; 669cdf0e10cSrcweir aIter->MimeType += ::ImplGetParameterString( *mpObjDesc ); 670cdf0e10cSrcweir 671cdf0e10cSrcweir #ifdef DEBUG 672cdf0e10cSrcweir fprintf( stderr, "TransferableHelper exchanged objectdescriptor [ %s ]\n", 673cdf0e10cSrcweir ByteString( String( aIter->MimeType), RTL_TEXTENCODING_ASCII_US ).GetBuffer() ); 674cdf0e10cSrcweir #endif 675cdf0e10cSrcweir } 676cdf0e10cSrcweir 677cdf0e10cSrcweir aIter = aEnd; 678cdf0e10cSrcweir bAdd = sal_False; 679cdf0e10cSrcweir } 680cdf0e10cSrcweir else 681cdf0e10cSrcweir aIter++; 682cdf0e10cSrcweir } 683cdf0e10cSrcweir 684cdf0e10cSrcweir if( bAdd ) 685cdf0e10cSrcweir { 686cdf0e10cSrcweir DataFlavorEx aFlavorEx; 687cdf0e10cSrcweir DataFlavor aObjDescFlavor; 688cdf0e10cSrcweir 689cdf0e10cSrcweir aFlavorEx.MimeType = rFlavor.MimeType; 690cdf0e10cSrcweir aFlavorEx.HumanPresentableName = rFlavor.HumanPresentableName; 691cdf0e10cSrcweir aFlavorEx.DataType = rFlavor.DataType; 692cdf0e10cSrcweir aFlavorEx.mnSotId = SotExchange::RegisterFormat( rFlavor ); 693cdf0e10cSrcweir 694cdf0e10cSrcweir if( ( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR == aFlavorEx.mnSotId ) && mpObjDesc ) 695cdf0e10cSrcweir aFlavorEx.MimeType += ::ImplGetParameterString( *mpObjDesc ); 696cdf0e10cSrcweir 697cdf0e10cSrcweir mpFormats->push_back( aFlavorEx ); 698cdf0e10cSrcweir 699cdf0e10cSrcweir if( FORMAT_BITMAP == aFlavorEx.mnSotId ) 700cdf0e10cSrcweir { 701cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_BMP ); 702*45fd3b9aSArmin Le Grand AddFormat( SOT_FORMATSTR_ID_PNG ); 703cdf0e10cSrcweir } 704cdf0e10cSrcweir else if( FORMAT_GDIMETAFILE == aFlavorEx.mnSotId ) 705cdf0e10cSrcweir { 706cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_EMF ); 707cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_WMF ); 708cdf0e10cSrcweir } 709cdf0e10cSrcweir } 710cdf0e10cSrcweir } 711cdf0e10cSrcweir 712cdf0e10cSrcweir // ----------------------------------------------------------------------------- 713cdf0e10cSrcweir 714cdf0e10cSrcweir void TransferableHelper::RemoveFormat( SotFormatStringId nFormat ) 715cdf0e10cSrcweir { 716cdf0e10cSrcweir DataFlavor aFlavor; 717cdf0e10cSrcweir 718cdf0e10cSrcweir if( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) ) 719cdf0e10cSrcweir RemoveFormat( aFlavor ); 720cdf0e10cSrcweir } 721cdf0e10cSrcweir 722cdf0e10cSrcweir // ----------------------------------------------------------------------------- 723cdf0e10cSrcweir 724cdf0e10cSrcweir void TransferableHelper::RemoveFormat( const DataFlavor& rFlavor ) 725cdf0e10cSrcweir { 726cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 727cdf0e10cSrcweir 728cdf0e10cSrcweir while( aIter != aEnd ) 729cdf0e10cSrcweir { 730cdf0e10cSrcweir if( TransferableDataHelper::IsEqual( *aIter, rFlavor ) ) 731cdf0e10cSrcweir { 732cdf0e10cSrcweir aIter = mpFormats->erase( aIter ); 733cdf0e10cSrcweir aEnd = mpFormats->end(); 734cdf0e10cSrcweir } 735cdf0e10cSrcweir else 736cdf0e10cSrcweir ++aIter; 737cdf0e10cSrcweir } 738cdf0e10cSrcweir } 739cdf0e10cSrcweir 740cdf0e10cSrcweir // ----------------------------------------------------------------------------- 741cdf0e10cSrcweir 742cdf0e10cSrcweir sal_Bool TransferableHelper::HasFormat( SotFormatStringId nFormat ) 743cdf0e10cSrcweir { 744cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 745cdf0e10cSrcweir sal_Bool bRet = sal_False; 746cdf0e10cSrcweir 747cdf0e10cSrcweir while( aIter != aEnd ) 748cdf0e10cSrcweir { 749cdf0e10cSrcweir if( nFormat == (*aIter).mnSotId ) 750cdf0e10cSrcweir { 751cdf0e10cSrcweir aIter = aEnd; 752cdf0e10cSrcweir bRet = sal_True; 753cdf0e10cSrcweir } 754cdf0e10cSrcweir else 755cdf0e10cSrcweir ++aIter; 756cdf0e10cSrcweir } 757cdf0e10cSrcweir 758cdf0e10cSrcweir return bRet; 759cdf0e10cSrcweir } 760cdf0e10cSrcweir 761cdf0e10cSrcweir // ----------------------------------------------------------------------------- 762cdf0e10cSrcweir 763cdf0e10cSrcweir void TransferableHelper::ClearFormats() 764cdf0e10cSrcweir { 765cdf0e10cSrcweir mpFormats->clear(); 766cdf0e10cSrcweir maAny.clear(); 767cdf0e10cSrcweir } 768cdf0e10cSrcweir 769cdf0e10cSrcweir // ----------------------------------------------------------------------------- 770cdf0e10cSrcweir 771cdf0e10cSrcweir sal_Bool TransferableHelper::SetAny( const Any& rAny, const DataFlavor& ) 772cdf0e10cSrcweir { 773cdf0e10cSrcweir maAny = rAny; 774cdf0e10cSrcweir return( maAny.hasValue() ); 775cdf0e10cSrcweir } 776cdf0e10cSrcweir 777cdf0e10cSrcweir // ----------------------------------------------------------------------------- 778cdf0e10cSrcweir 779cdf0e10cSrcweir sal_Bool TransferableHelper::SetString( const ::rtl::OUString& rString, const DataFlavor& rFlavor ) 780cdf0e10cSrcweir { 781cdf0e10cSrcweir DataFlavor aFileFlavor; 782cdf0e10cSrcweir 783cdf0e10cSrcweir if( rString.getLength() && 784cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( FORMAT_FILE, aFileFlavor ) && 785cdf0e10cSrcweir TransferableDataHelper::IsEqual( aFileFlavor, rFlavor ) ) 786cdf0e10cSrcweir { 787cdf0e10cSrcweir const String aString( rString ); 788cdf0e10cSrcweir const ByteString aByteStr( aString, gsl_getSystemTextEncoding() ); 789cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( aByteStr.Len() + 1 ); 790cdf0e10cSrcweir 791cdf0e10cSrcweir rtl_copyMemory( aSeq.getArray(), aByteStr.GetBuffer(), aByteStr.Len() ); 792cdf0e10cSrcweir aSeq[ aByteStr.Len() ] = 0; 793cdf0e10cSrcweir maAny <<= aSeq; 794cdf0e10cSrcweir } 795cdf0e10cSrcweir else 796cdf0e10cSrcweir maAny <<= rString; 797cdf0e10cSrcweir 798cdf0e10cSrcweir return( maAny.hasValue() ); 799cdf0e10cSrcweir } 800cdf0e10cSrcweir 801cdf0e10cSrcweir // ----------------------------------------------------------------------------- 802cdf0e10cSrcweir 803*45fd3b9aSArmin Le Grand sal_Bool TransferableHelper::SetBitmapEx( const BitmapEx& rBitmapEx, const DataFlavor& rFlavor ) 804cdf0e10cSrcweir { 805*45fd3b9aSArmin Le Grand if( !rBitmapEx.IsEmpty() ) 806cdf0e10cSrcweir { 807*45fd3b9aSArmin Le Grand SvMemoryStream aMemStm( 65535, 65535 ); 808cdf0e10cSrcweir 809*45fd3b9aSArmin Le Grand if(rFlavor.MimeType.equalsIgnoreAsciiCase(::rtl::OUString::createFromAscii("image/png"))) 810*45fd3b9aSArmin Le Grand { 811*45fd3b9aSArmin Le Grand // write a PNG 812*45fd3b9aSArmin Le Grand ::vcl::PNGWriter aPNGWriter(rBitmapEx); 813*45fd3b9aSArmin Le Grand 814*45fd3b9aSArmin Le Grand aPNGWriter.Write(aMemStm); 815*45fd3b9aSArmin Le Grand } 816*45fd3b9aSArmin Le Grand else 817*45fd3b9aSArmin Le Grand { 818*45fd3b9aSArmin Le Grand const Bitmap aBitmap(rBitmapEx.GetBitmap()); 819*45fd3b9aSArmin Le Grand 820*45fd3b9aSArmin Le Grand if(rBitmapEx.IsTransparent()) 821*45fd3b9aSArmin Le Grand { 822*45fd3b9aSArmin Le Grand const Bitmap aMask(rBitmapEx.GetAlpha().GetBitmap()); 823*45fd3b9aSArmin Le Grand 824*45fd3b9aSArmin Le Grand // explicitely use Bitmap::Write with bCompressed = sal_False and bFileHeader = sal_True 825*45fd3b9aSArmin Le Grand WriteDIBV5(aBitmap, aMask, aMemStm); 826*45fd3b9aSArmin Le Grand } 827*45fd3b9aSArmin Le Grand else 828*45fd3b9aSArmin Le Grand { 829*45fd3b9aSArmin Le Grand // explicitely use Bitmap::Write with bCompressed = sal_False and bFileHeader = sal_True 830*45fd3b9aSArmin Le Grand WriteDIB(aBitmap, aMemStm, false, true); 831*45fd3b9aSArmin Le Grand } 832*45fd3b9aSArmin Le Grand } 833*45fd3b9aSArmin Le Grand 834*45fd3b9aSArmin Le Grand maAny <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ); 835cdf0e10cSrcweir } 836cdf0e10cSrcweir 837cdf0e10cSrcweir return( maAny.hasValue() ); 838cdf0e10cSrcweir } 839cdf0e10cSrcweir 840cdf0e10cSrcweir // ----------------------------------------------------------------------------- 841cdf0e10cSrcweir 842cdf0e10cSrcweir sal_Bool TransferableHelper::SetGDIMetaFile( const GDIMetaFile& rMtf, const DataFlavor& ) 843cdf0e10cSrcweir { 844cdf0e10cSrcweir if( rMtf.GetActionCount() ) 845cdf0e10cSrcweir { 846cdf0e10cSrcweir SvMemoryStream aMemStm( 65535, 65535 ); 847cdf0e10cSrcweir 848cdf0e10cSrcweir ( (GDIMetaFile&) rMtf ).Write( aMemStm ); 849cdf0e10cSrcweir maAny <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ); 850cdf0e10cSrcweir } 851cdf0e10cSrcweir 852cdf0e10cSrcweir return( maAny.hasValue() ); 853cdf0e10cSrcweir } 854cdf0e10cSrcweir 855cdf0e10cSrcweir // ----------------------------------------------------------------------------- 856cdf0e10cSrcweir 857cdf0e10cSrcweir sal_Bool TransferableHelper::SetGraphic( const Graphic& rGraphic, const DataFlavor& ) 858cdf0e10cSrcweir { 859cdf0e10cSrcweir if( rGraphic.GetType() != GRAPHIC_NONE ) 860cdf0e10cSrcweir { 861cdf0e10cSrcweir SvMemoryStream aMemStm( 65535, 65535 ); 862cdf0e10cSrcweir 863cdf0e10cSrcweir aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); 864cdf0e10cSrcweir aMemStm.SetCompressMode( COMPRESSMODE_NATIVE ); 865cdf0e10cSrcweir aMemStm << rGraphic; 866cdf0e10cSrcweir maAny <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ); 867cdf0e10cSrcweir } 868cdf0e10cSrcweir 869cdf0e10cSrcweir return( maAny.hasValue() ); 870cdf0e10cSrcweir } 871cdf0e10cSrcweir 872cdf0e10cSrcweir // ----------------------------------------------------------------------------- 873cdf0e10cSrcweir 874cdf0e10cSrcweir sal_Bool TransferableHelper::SetImageMap( const ImageMap& rIMap, const ::com::sun::star::datatransfer::DataFlavor& ) 875cdf0e10cSrcweir { 876cdf0e10cSrcweir SvMemoryStream aMemStm( 8192, 8192 ); 877cdf0e10cSrcweir 878cdf0e10cSrcweir aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); 879cdf0e10cSrcweir rIMap.Write( aMemStm, String() ); 880cdf0e10cSrcweir maAny <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ); 881cdf0e10cSrcweir 882cdf0e10cSrcweir return( maAny.hasValue() ); 883cdf0e10cSrcweir } 884cdf0e10cSrcweir 885cdf0e10cSrcweir // ----------------------------------------------------------------------------- 886cdf0e10cSrcweir 887cdf0e10cSrcweir sal_Bool TransferableHelper::SetTransferableObjectDescriptor( const TransferableObjectDescriptor& rDesc, 888cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& ) 889cdf0e10cSrcweir { 890cdf0e10cSrcweir PrepareOLE( rDesc ); 891cdf0e10cSrcweir 892cdf0e10cSrcweir SvMemoryStream aMemStm( 1024, 1024 ); 893cdf0e10cSrcweir 894cdf0e10cSrcweir aMemStm << rDesc; 895cdf0e10cSrcweir maAny <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Tell() ); 896cdf0e10cSrcweir 897cdf0e10cSrcweir return( maAny.hasValue() ); 898cdf0e10cSrcweir } 899cdf0e10cSrcweir 900cdf0e10cSrcweir // ----------------------------------------------------------------------------- 901cdf0e10cSrcweir 902cdf0e10cSrcweir sal_Bool TransferableHelper::SetINetBookmark( const INetBookmark& rBmk, 903cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) 904cdf0e10cSrcweir { 905cdf0e10cSrcweir rtl_TextEncoding eSysCSet = gsl_getSystemTextEncoding(); 906cdf0e10cSrcweir 907cdf0e10cSrcweir switch( SotExchange::GetFormat( rFlavor ) ) 908cdf0e10cSrcweir { 909cdf0e10cSrcweir case( SOT_FORMATSTR_ID_SOLK ): 910cdf0e10cSrcweir { 911cdf0e10cSrcweir ByteString sURL( rBmk.GetURL(), eSysCSet ), 912cdf0e10cSrcweir sDesc( rBmk.GetDescription(), eSysCSet ); 913cdf0e10cSrcweir ByteString sOut( ByteString::CreateFromInt32( sURL.Len() )); 914cdf0e10cSrcweir ( sOut += '@' ) += sURL; 915cdf0e10cSrcweir sOut += ByteString::CreateFromInt32( sDesc.Len() ); 916cdf0e10cSrcweir ( sOut += '@' ) += sDesc; 917cdf0e10cSrcweir 918cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( sOut.Len() ); 919cdf0e10cSrcweir memcpy( aSeq.getArray(), sOut.GetBuffer(), sOut.Len() ); 920cdf0e10cSrcweir maAny <<= aSeq; 921cdf0e10cSrcweir } 922cdf0e10cSrcweir break; 923cdf0e10cSrcweir 924cdf0e10cSrcweir case( FORMAT_STRING ): 925cdf0e10cSrcweir maAny <<= ::rtl::OUString( rBmk.GetURL() ); 926cdf0e10cSrcweir break; 927cdf0e10cSrcweir 928cdf0e10cSrcweir case( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ): 929cdf0e10cSrcweir { 930cdf0e10cSrcweir ByteString sURL( rBmk.GetURL(), eSysCSet ); 931cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( sURL.Len() ); 932cdf0e10cSrcweir memcpy( aSeq.getArray(), sURL.GetBuffer(), sURL.Len() ); 933cdf0e10cSrcweir maAny <<= aSeq; 934cdf0e10cSrcweir } 935cdf0e10cSrcweir break; 936cdf0e10cSrcweir 937cdf0e10cSrcweir case( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ): 938cdf0e10cSrcweir { 939cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( 2048 ); 940cdf0e10cSrcweir 941cdf0e10cSrcweir memset( aSeq.getArray(), 0, 2048 ); 942cdf0e10cSrcweir strcpy( reinterpret_cast< char* >( aSeq.getArray() ), ByteString( rBmk.GetURL(), eSysCSet).GetBuffer() ); 943cdf0e10cSrcweir strcpy( reinterpret_cast< char* >( aSeq.getArray() ) + 1024, ByteString( rBmk.GetDescription(), eSysCSet ).GetBuffer() ); 944cdf0e10cSrcweir 945cdf0e10cSrcweir maAny <<= aSeq; 946cdf0e10cSrcweir } 947cdf0e10cSrcweir break; 948cdf0e10cSrcweir 949cdf0e10cSrcweir #ifdef WNT 950cdf0e10cSrcweir case SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR: 951cdf0e10cSrcweir { 952cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( sizeof( FILEGROUPDESCRIPTOR ) ); 953cdf0e10cSrcweir FILEGROUPDESCRIPTOR* pFDesc = (FILEGROUPDESCRIPTOR*) aSeq.getArray(); 954cdf0e10cSrcweir FILEDESCRIPTOR& rFDesc1 = pFDesc->fgd[ 0 ]; 955cdf0e10cSrcweir 956cdf0e10cSrcweir pFDesc->cItems = 1; 957cdf0e10cSrcweir memset( &rFDesc1, 0, sizeof( FILEDESCRIPTOR ) ); 958cdf0e10cSrcweir rFDesc1.dwFlags = FD_LINKUI; 959cdf0e10cSrcweir 960cdf0e10cSrcweir ByteString aStr( rBmk.GetDescription(), eSysCSet ); 961cdf0e10cSrcweir for( sal_uInt16 nChar = 0; nChar < aStr.Len(); ++nChar ) 962cdf0e10cSrcweir if( strchr( "\\/:*?\"<>|", aStr.GetChar( nChar ) ) ) 963cdf0e10cSrcweir aStr.Erase( nChar--, 1 ); 964cdf0e10cSrcweir 965cdf0e10cSrcweir aStr.Insert( "Shortcut to ", 0 ); 966cdf0e10cSrcweir aStr += ".URL"; 967cdf0e10cSrcweir strcpy( rFDesc1.cFileName, aStr.GetBuffer() ); 968cdf0e10cSrcweir 969cdf0e10cSrcweir maAny <<= aSeq; 970cdf0e10cSrcweir } 971cdf0e10cSrcweir break; 972cdf0e10cSrcweir 973cdf0e10cSrcweir case SOT_FORMATSTR_ID_FILECONTENT: 974cdf0e10cSrcweir { 975cdf0e10cSrcweir String aStr( RTL_CONSTASCII_STRINGPARAM( "[InternetShortcut]\x0aURL=" ) ); 976cdf0e10cSrcweir maAny <<= ::rtl::OUString( aStr += rBmk.GetURL() ); 977cdf0e10cSrcweir } 978cdf0e10cSrcweir break; 979cdf0e10cSrcweir #endif 980cdf0e10cSrcweir 981cdf0e10cSrcweir default: 982cdf0e10cSrcweir break; 983cdf0e10cSrcweir } 984cdf0e10cSrcweir 985cdf0e10cSrcweir return( maAny.hasValue() ); 986cdf0e10cSrcweir } 987cdf0e10cSrcweir 988cdf0e10cSrcweir // ----------------------------------------------------------------------------- 989cdf0e10cSrcweir 990cdf0e10cSrcweir sal_Bool TransferableHelper::SetINetImage( const INetImage& rINtImg, 991cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& rFlavor ) 992cdf0e10cSrcweir { 993cdf0e10cSrcweir SvMemoryStream aMemStm( 1024, 1024 ); 994cdf0e10cSrcweir 995cdf0e10cSrcweir aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); 996cdf0e10cSrcweir rINtImg.Write( aMemStm, SotExchange::GetFormat( rFlavor ) ); 997cdf0e10cSrcweir 998cdf0e10cSrcweir maAny <<= Sequence< sal_Int8 >( reinterpret_cast< const sal_Int8* >( aMemStm.GetData() ), aMemStm.Seek( STREAM_SEEK_TO_END ) ); 999cdf0e10cSrcweir 1000cdf0e10cSrcweir return( maAny.hasValue() ); 1001cdf0e10cSrcweir } 1002cdf0e10cSrcweir 1003cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1004cdf0e10cSrcweir 1005cdf0e10cSrcweir sal_Bool TransferableHelper::SetFileList( const FileList& rFileList, 1006cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& ) 1007cdf0e10cSrcweir { 1008cdf0e10cSrcweir SvMemoryStream aMemStm( 4096, 4096 ); 1009cdf0e10cSrcweir 1010cdf0e10cSrcweir aMemStm.SetVersion( SOFFICE_FILEFORMAT_50 ); 1011cdf0e10cSrcweir aMemStm << rFileList; 1012cdf0e10cSrcweir 1013cdf0e10cSrcweir maAny <<= Sequence< sal_Int8 >( static_cast< const sal_Int8* >( aMemStm.GetData() ), 1014cdf0e10cSrcweir aMemStm.Seek( STREAM_SEEK_TO_END ) ); 1015cdf0e10cSrcweir 1016cdf0e10cSrcweir return( maAny.hasValue() ); 1017cdf0e10cSrcweir } 1018cdf0e10cSrcweir 1019cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1020cdf0e10cSrcweir 1021cdf0e10cSrcweir sal_Bool TransferableHelper::SetObject( void* pUserObject, sal_uInt32 nUserObjectId, const DataFlavor& rFlavor ) 1022cdf0e10cSrcweir { 1023cdf0e10cSrcweir SotStorageStreamRef xStm( new SotStorageStream( String() ) ); 1024cdf0e10cSrcweir 1025cdf0e10cSrcweir xStm->SetVersion( SOFFICE_FILEFORMAT_50 ); 1026cdf0e10cSrcweir 1027cdf0e10cSrcweir if( pUserObject && WriteObject( xStm, pUserObject, nUserObjectId, rFlavor ) ) 1028cdf0e10cSrcweir { 1029cdf0e10cSrcweir const sal_uInt32 nLen = xStm->Seek( STREAM_SEEK_TO_END ); 1030cdf0e10cSrcweir Sequence< sal_Int8 > aSeq( nLen ); 1031cdf0e10cSrcweir 1032cdf0e10cSrcweir xStm->Seek( STREAM_SEEK_TO_BEGIN ); 1033cdf0e10cSrcweir xStm->Read( aSeq.getArray(), nLen ); 1034cdf0e10cSrcweir 1035cdf0e10cSrcweir if( nLen && ( SotExchange::GetFormat( rFlavor ) == SOT_FORMAT_STRING ) ) 1036cdf0e10cSrcweir { 1037cdf0e10cSrcweir //JP 24.7.2001: as I know was this only for the writer application and this 1038cdf0e10cSrcweir // writes now UTF16 format into the stream 1039cdf0e10cSrcweir //JP 6.8.2001: and now it writes UTF8 because then exist no problem with 1040cdf0e10cSrcweir // little / big endians! - Bug 88121 1041cdf0e10cSrcweir maAny <<= ::rtl::OUString( reinterpret_cast< const sal_Char* >( aSeq.getConstArray() ), nLen - 1, RTL_TEXTENCODING_UTF8 ); 1042cdf0e10cSrcweir } 1043cdf0e10cSrcweir else 1044cdf0e10cSrcweir maAny <<= aSeq; 1045cdf0e10cSrcweir } 1046cdf0e10cSrcweir 1047cdf0e10cSrcweir return( maAny.hasValue() ); 1048cdf0e10cSrcweir } 1049cdf0e10cSrcweir 1050cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1051cdf0e10cSrcweir 1052cdf0e10cSrcweir sal_Bool TransferableHelper::SetInterface( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& rIf, 1053cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& ) 1054cdf0e10cSrcweir { 1055cdf0e10cSrcweir maAny <<= rIf; 1056cdf0e10cSrcweir return( maAny.hasValue() ); 1057cdf0e10cSrcweir } 1058cdf0e10cSrcweir 1059cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1060cdf0e10cSrcweir 1061cdf0e10cSrcweir sal_Bool TransferableHelper::WriteObject( SotStorageStreamRef&, void*, sal_uInt32, const DataFlavor& ) 1062cdf0e10cSrcweir { 1063cdf0e10cSrcweir DBG_ERROR( "TransferableHelper::WriteObject( ... ) not implemented" ); 1064cdf0e10cSrcweir return sal_False; 1065cdf0e10cSrcweir } 1066cdf0e10cSrcweir 1067cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1068cdf0e10cSrcweir 1069cdf0e10cSrcweir void TransferableHelper::DragFinished( sal_Int8 ) 1070cdf0e10cSrcweir { 1071cdf0e10cSrcweir } 1072cdf0e10cSrcweir 1073cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1074cdf0e10cSrcweir 1075cdf0e10cSrcweir void TransferableHelper::ObjectReleased() 1076cdf0e10cSrcweir { 1077cdf0e10cSrcweir } 1078cdf0e10cSrcweir 1079cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1080cdf0e10cSrcweir 1081cdf0e10cSrcweir void TransferableHelper::PrepareOLE( const TransferableObjectDescriptor& rObjDesc ) 1082cdf0e10cSrcweir { 1083cdf0e10cSrcweir delete mpObjDesc; 1084cdf0e10cSrcweir mpObjDesc = new TransferableObjectDescriptor( rObjDesc ); 1085cdf0e10cSrcweir 1086cdf0e10cSrcweir if( HasFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ) ) 1087cdf0e10cSrcweir AddFormat( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR ); 1088cdf0e10cSrcweir } 1089cdf0e10cSrcweir 1090cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1091cdf0e10cSrcweir 1092cdf0e10cSrcweir void TransferableHelper::CopyToClipboard( Window *pWindow ) const 1093cdf0e10cSrcweir { 1094cdf0e10cSrcweir DBG_ASSERT( pWindow, "Window pointer is NULL" ); 1095cdf0e10cSrcweir Reference< XClipboard > xClipboard; 1096cdf0e10cSrcweir 1097cdf0e10cSrcweir if( pWindow ) 1098cdf0e10cSrcweir xClipboard = pWindow->GetClipboard(); 1099cdf0e10cSrcweir 1100cdf0e10cSrcweir if( xClipboard.is() ) 1101cdf0e10cSrcweir mxClipboard = xClipboard; 1102cdf0e10cSrcweir 1103cdf0e10cSrcweir if( mxClipboard.is() && !mxTerminateListener.is() ) 1104cdf0e10cSrcweir { 1105cdf0e10cSrcweir const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 1106cdf0e10cSrcweir 1107cdf0e10cSrcweir try 1108cdf0e10cSrcweir { 1109cdf0e10cSrcweir TransferableHelper* pThis = const_cast< TransferableHelper* >( this ); 1110cdf0e10cSrcweir Reference< XMultiServiceFactory > xFact( ::comphelper::getProcessServiceFactory() ); 1111cdf0e10cSrcweir 1112cdf0e10cSrcweir if( xFact.is() ) 1113cdf0e10cSrcweir { 1114cdf0e10cSrcweir Reference< XDesktop > xDesktop( xFact->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ), UNO_QUERY ); 1115cdf0e10cSrcweir 1116cdf0e10cSrcweir if( xDesktop.is() ) 1117cdf0e10cSrcweir xDesktop->addTerminateListener( pThis->mxTerminateListener = new TerminateListener( *pThis ) ); 1118cdf0e10cSrcweir } 1119cdf0e10cSrcweir 1120cdf0e10cSrcweir mxClipboard->setContents( pThis, pThis ); 1121cdf0e10cSrcweir } 1122cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1123cdf0e10cSrcweir { 1124cdf0e10cSrcweir } 1125cdf0e10cSrcweir 1126cdf0e10cSrcweir Application::AcquireSolarMutex( nRef ); 1127cdf0e10cSrcweir } 1128cdf0e10cSrcweir } 1129cdf0e10cSrcweir 1130cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1131cdf0e10cSrcweir 1132cdf0e10cSrcweir void TransferableHelper::CopyToSelection( Window *pWindow ) const 1133cdf0e10cSrcweir { 1134cdf0e10cSrcweir DBG_ASSERT( pWindow, "Window pointer is NULL" ); 1135cdf0e10cSrcweir Reference< XClipboard > xSelection; 1136cdf0e10cSrcweir 1137cdf0e10cSrcweir if( pWindow ) 1138cdf0e10cSrcweir xSelection = pWindow->GetPrimarySelection(); 1139cdf0e10cSrcweir 1140cdf0e10cSrcweir if( xSelection.is() && !mxTerminateListener.is() ) 1141cdf0e10cSrcweir { 1142cdf0e10cSrcweir const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 1143cdf0e10cSrcweir 1144cdf0e10cSrcweir try 1145cdf0e10cSrcweir { 1146cdf0e10cSrcweir TransferableHelper* pThis = const_cast< TransferableHelper* >( this ); 1147cdf0e10cSrcweir Reference< XMultiServiceFactory > xFact( ::comphelper::getProcessServiceFactory() ); 1148cdf0e10cSrcweir 1149cdf0e10cSrcweir if( xFact.is() ) 1150cdf0e10cSrcweir { 1151cdf0e10cSrcweir Reference< XDesktop > xDesktop( xFact->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.frame.Desktop" ) ), UNO_QUERY ); 1152cdf0e10cSrcweir 1153cdf0e10cSrcweir if( xDesktop.is() ) 1154cdf0e10cSrcweir xDesktop->addTerminateListener( pThis->mxTerminateListener = new TerminateListener( *pThis ) ); 1155cdf0e10cSrcweir } 1156cdf0e10cSrcweir 1157cdf0e10cSrcweir xSelection->setContents( pThis, pThis ); 1158cdf0e10cSrcweir } 1159cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1160cdf0e10cSrcweir { 1161cdf0e10cSrcweir } 1162cdf0e10cSrcweir 1163cdf0e10cSrcweir Application::AcquireSolarMutex( nRef ); 1164cdf0e10cSrcweir } 1165cdf0e10cSrcweir } 1166cdf0e10cSrcweir 1167cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1168cdf0e10cSrcweir 1169cdf0e10cSrcweir void TransferableHelper::StartDrag( Window* pWindow, sal_Int8 nDnDSourceActions, 1170cdf0e10cSrcweir sal_Int32 nDnDPointer, sal_Int32 nDnDImage ) 1171cdf0e10cSrcweir 1172cdf0e10cSrcweir { 1173cdf0e10cSrcweir DBG_ASSERT( pWindow, "Window pointer is NULL" ); 1174cdf0e10cSrcweir Reference< XDragSource > xDragSource( pWindow->GetDragSource() ); 1175cdf0e10cSrcweir 1176cdf0e10cSrcweir if( xDragSource.is() ) 1177cdf0e10cSrcweir { 1178cdf0e10cSrcweir /* 1179cdf0e10cSrcweir * #96792# release mouse before actually starting DnD. 1180cdf0e10cSrcweir * This is necessary for the X11 DnD implementation to work. 1181cdf0e10cSrcweir */ 1182cdf0e10cSrcweir if( pWindow->IsMouseCaptured() ) 1183cdf0e10cSrcweir pWindow->ReleaseMouse(); 1184cdf0e10cSrcweir 1185cdf0e10cSrcweir const Point aPt( pWindow->GetPointerPosPixel() ); 1186cdf0e10cSrcweir 1187cdf0e10cSrcweir // On Mac OS X we are forced to execute 'startDrag' synchronously 1188cdf0e10cSrcweir // contrary to the XDragSource interface specification because 1189cdf0e10cSrcweir // we can receive drag events from the system only in the main 1190cdf0e10cSrcweir // thread 1191cdf0e10cSrcweir #if !defined(QUARTZ) 1192cdf0e10cSrcweir const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 1193cdf0e10cSrcweir #endif 1194cdf0e10cSrcweir 1195cdf0e10cSrcweir try 1196cdf0e10cSrcweir { 1197cdf0e10cSrcweir DragGestureEvent aEvt; 1198cdf0e10cSrcweir aEvt.DragAction = DNDConstants::ACTION_COPY; 1199cdf0e10cSrcweir aEvt.DragOriginX = aPt.X(); 1200cdf0e10cSrcweir aEvt.DragOriginY = aPt.Y(); 1201cdf0e10cSrcweir aEvt.DragSource = xDragSource; 1202cdf0e10cSrcweir 1203cdf0e10cSrcweir xDragSource->startDrag( aEvt, nDnDSourceActions, nDnDPointer, nDnDImage, this, this ); 1204cdf0e10cSrcweir } 1205cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1206cdf0e10cSrcweir { 1207cdf0e10cSrcweir } 1208cdf0e10cSrcweir 1209cdf0e10cSrcweir // See above for the reason of this define 1210cdf0e10cSrcweir #if !defined(QUARTZ) 1211cdf0e10cSrcweir Application::AcquireSolarMutex( nRef ); 1212cdf0e10cSrcweir #endif 1213cdf0e10cSrcweir } 1214cdf0e10cSrcweir } 1215cdf0e10cSrcweir 1216cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1217cdf0e10cSrcweir 1218cdf0e10cSrcweir void TransferableHelper::ClearSelection( Window *pWindow ) 1219cdf0e10cSrcweir { 1220cdf0e10cSrcweir DBG_ASSERT( pWindow, "Window pointer is NULL" ); 1221cdf0e10cSrcweir Reference< XClipboard > xSelection( pWindow->GetPrimarySelection() ); 1222cdf0e10cSrcweir 1223cdf0e10cSrcweir if( xSelection.is() ) 1224cdf0e10cSrcweir xSelection->setContents( NULL, NULL ); 1225cdf0e10cSrcweir } 1226cdf0e10cSrcweir 1227cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1228cdf0e10cSrcweir 1229cdf0e10cSrcweir Reference< XClipboard> TransferableHelper::GetSystemClipboard() 1230cdf0e10cSrcweir { 1231cdf0e10cSrcweir Window *pFocusWindow = Application::GetFocusWindow(); 1232cdf0e10cSrcweir 1233cdf0e10cSrcweir if( pFocusWindow ) 1234cdf0e10cSrcweir return pFocusWindow->GetClipboard(); 1235cdf0e10cSrcweir 1236cdf0e10cSrcweir return Reference< XClipboard > (); 1237cdf0e10cSrcweir } 1238cdf0e10cSrcweir 1239cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1240cdf0e10cSrcweir 1241cdf0e10cSrcweir const Sequence< sal_Int8 >& TransferableHelper::getUnoTunnelId() 1242cdf0e10cSrcweir { 1243cdf0e10cSrcweir static Sequence< sal_Int8 > aSeq; 1244cdf0e10cSrcweir 1245cdf0e10cSrcweir if( !aSeq.getLength() ) 1246cdf0e10cSrcweir { 1247cdf0e10cSrcweir static osl::Mutex aCreateMutex; 1248cdf0e10cSrcweir osl::Guard< osl::Mutex > aGuard( aCreateMutex ); 1249cdf0e10cSrcweir 1250cdf0e10cSrcweir aSeq.realloc( 16 ); 1251cdf0e10cSrcweir rtl_createUuid( reinterpret_cast< sal_uInt8* >( aSeq.getArray() ), 0, sal_True ); 1252cdf0e10cSrcweir } 1253cdf0e10cSrcweir 1254cdf0e10cSrcweir 1255cdf0e10cSrcweir return aSeq; 1256cdf0e10cSrcweir } 1257cdf0e10cSrcweir 1258cdf0e10cSrcweir // --------------------------------- 1259cdf0e10cSrcweir // - TransferableClipboardNotifier - 1260cdf0e10cSrcweir // --------------------------------- 1261cdf0e10cSrcweir 1262cdf0e10cSrcweir class TransferableClipboardNotifier : public ::cppu::WeakImplHelper1< XClipboardListener > 1263cdf0e10cSrcweir { 1264cdf0e10cSrcweir private: 1265cdf0e10cSrcweir ::osl::Mutex& mrMutex; 1266cdf0e10cSrcweir Reference< XClipboardNotifier > mxNotifier; 1267cdf0e10cSrcweir TransferableDataHelper* mpListener; 1268cdf0e10cSrcweir 1269cdf0e10cSrcweir protected: 1270cdf0e10cSrcweir // XClipboardListener 1271cdf0e10cSrcweir virtual void SAL_CALL changedContents( const clipboard::ClipboardEvent& event ) throw (RuntimeException); 1272cdf0e10cSrcweir 1273cdf0e10cSrcweir // XEventListener 1274cdf0e10cSrcweir virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException); 1275cdf0e10cSrcweir 1276cdf0e10cSrcweir public: 1277cdf0e10cSrcweir TransferableClipboardNotifier( const Reference< XClipboard >& _rxClipboard, TransferableDataHelper& _rListener, ::osl::Mutex& _rMutex ); 1278cdf0e10cSrcweir 1279cdf0e10cSrcweir /// determines whether we're currently listening 1280cdf0e10cSrcweir inline bool isListening() const { return !isDisposed(); } 1281cdf0e10cSrcweir 1282cdf0e10cSrcweir /// determines whether the instance is disposed 1283cdf0e10cSrcweir inline bool isDisposed() const { return mpListener == NULL; } 1284cdf0e10cSrcweir 1285cdf0e10cSrcweir /// makes the instance non-functional 1286cdf0e10cSrcweir void dispose(); 1287cdf0e10cSrcweir }; 1288cdf0e10cSrcweir 1289cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1290cdf0e10cSrcweir 1291cdf0e10cSrcweir TransferableClipboardNotifier::TransferableClipboardNotifier( const Reference< XClipboard >& _rxClipboard, TransferableDataHelper& _rListener, ::osl::Mutex& _rMutex ) 1292cdf0e10cSrcweir :mrMutex( _rMutex ) 1293cdf0e10cSrcweir ,mxNotifier( _rxClipboard, UNO_QUERY ) 1294cdf0e10cSrcweir ,mpListener( &_rListener ) 1295cdf0e10cSrcweir { 1296cdf0e10cSrcweir osl_incrementInterlockedCount( &m_refCount ); 1297cdf0e10cSrcweir { 1298cdf0e10cSrcweir if ( mxNotifier.is() ) 1299cdf0e10cSrcweir mxNotifier->addClipboardListener( this ); 1300cdf0e10cSrcweir else 1301cdf0e10cSrcweir // born dead 1302cdf0e10cSrcweir mpListener = NULL; 1303cdf0e10cSrcweir } 1304cdf0e10cSrcweir osl_decrementInterlockedCount( &m_refCount ); 1305cdf0e10cSrcweir } 1306cdf0e10cSrcweir 1307cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1308cdf0e10cSrcweir 1309cdf0e10cSrcweir void SAL_CALL TransferableClipboardNotifier::changedContents( const clipboard::ClipboardEvent& event ) throw (RuntimeException) 1310cdf0e10cSrcweir { 1311cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 1312cdf0e10cSrcweir // the SolarMutex here is necessary, since 1313cdf0e10cSrcweir // - we cannot call mpListener without our own mutex locked 1314cdf0e10cSrcweir // - Rebind respectively InitFormats (called by Rebind) will 1315cdf0e10cSrcweir // try to lock the SolarMutex, too 1316cdf0e10cSrcweir ::osl::MutexGuard aGuard( mrMutex ); 1317cdf0e10cSrcweir if( mpListener ) 1318cdf0e10cSrcweir mpListener->Rebind( event.Contents ); 1319cdf0e10cSrcweir } 1320cdf0e10cSrcweir 1321cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1322cdf0e10cSrcweir 1323cdf0e10cSrcweir void SAL_CALL TransferableClipboardNotifier::disposing( const EventObject& ) throw (RuntimeException) 1324cdf0e10cSrcweir { 1325cdf0e10cSrcweir // clipboard is being disposed. Hmm. Okay, become disfunctional myself. 1326cdf0e10cSrcweir dispose(); 1327cdf0e10cSrcweir } 1328cdf0e10cSrcweir 1329cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1330cdf0e10cSrcweir 1331cdf0e10cSrcweir void TransferableClipboardNotifier::dispose() 1332cdf0e10cSrcweir { 1333cdf0e10cSrcweir ::osl::MutexGuard aGuard( mrMutex ); 1334cdf0e10cSrcweir 1335cdf0e10cSrcweir Reference< XClipboardListener > xKeepMeAlive( this ); 1336cdf0e10cSrcweir 1337cdf0e10cSrcweir if ( mxNotifier.is() ) 1338cdf0e10cSrcweir mxNotifier->removeClipboardListener( this ); 1339cdf0e10cSrcweir mxNotifier.clear(); 1340cdf0e10cSrcweir 1341cdf0e10cSrcweir mpListener = NULL; 1342cdf0e10cSrcweir } 1343cdf0e10cSrcweir 1344cdf0e10cSrcweir // ------------------------------- 1345cdf0e10cSrcweir // - TransferableDataHelper_Impl - 1346cdf0e10cSrcweir // ------------------------------- 1347cdf0e10cSrcweir 1348cdf0e10cSrcweir struct TransferableDataHelper_Impl 1349cdf0e10cSrcweir { 1350cdf0e10cSrcweir ::osl::Mutex maMutex; 1351cdf0e10cSrcweir TransferableClipboardNotifier* mpClipboardListener; 1352cdf0e10cSrcweir 1353cdf0e10cSrcweir TransferableDataHelper_Impl() 1354cdf0e10cSrcweir :mpClipboardListener( NULL ) 1355cdf0e10cSrcweir { 1356cdf0e10cSrcweir } 1357cdf0e10cSrcweir }; 1358cdf0e10cSrcweir 1359cdf0e10cSrcweir // -------------------------- 1360cdf0e10cSrcweir // - TransferableDataHelper - 1361cdf0e10cSrcweir // -------------------------- 1362cdf0e10cSrcweir 1363cdf0e10cSrcweir TransferableDataHelper::TransferableDataHelper() : 1364cdf0e10cSrcweir mpFormats( new DataFlavorExVector ), 1365cdf0e10cSrcweir mpObjDesc( new TransferableObjectDescriptor ), 1366cdf0e10cSrcweir mpImpl( new TransferableDataHelper_Impl ) 1367cdf0e10cSrcweir { 1368cdf0e10cSrcweir } 1369cdf0e10cSrcweir 1370cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1371cdf0e10cSrcweir 1372cdf0e10cSrcweir TransferableDataHelper::TransferableDataHelper( const Reference< ::com::sun::star::datatransfer::XTransferable >& rxTransferable ) : 1373cdf0e10cSrcweir mxTransfer( rxTransferable ), 1374cdf0e10cSrcweir mpFormats( new DataFlavorExVector ), 1375cdf0e10cSrcweir mpObjDesc( new TransferableObjectDescriptor ), 1376cdf0e10cSrcweir mpImpl( new TransferableDataHelper_Impl ) 1377cdf0e10cSrcweir { 1378cdf0e10cSrcweir InitFormats(); 1379cdf0e10cSrcweir } 1380cdf0e10cSrcweir 1381cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1382cdf0e10cSrcweir 1383cdf0e10cSrcweir TransferableDataHelper::TransferableDataHelper( const TransferableDataHelper& rDataHelper ) : 1384cdf0e10cSrcweir mxTransfer( rDataHelper.mxTransfer ), 1385cdf0e10cSrcweir mxClipboard( rDataHelper.mxClipboard ), 1386cdf0e10cSrcweir mpFormats( new DataFlavorExVector( *rDataHelper.mpFormats ) ), 1387cdf0e10cSrcweir mpObjDesc( new TransferableObjectDescriptor( *rDataHelper.mpObjDesc ) ), 1388cdf0e10cSrcweir mpImpl( new TransferableDataHelper_Impl ) 1389cdf0e10cSrcweir { 1390cdf0e10cSrcweir } 1391cdf0e10cSrcweir 1392cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1393cdf0e10cSrcweir 1394cdf0e10cSrcweir TransferableDataHelper& TransferableDataHelper::operator=( const TransferableDataHelper& rDataHelper ) 1395cdf0e10cSrcweir { 1396cdf0e10cSrcweir if ( this != &rDataHelper ) 1397cdf0e10cSrcweir { 1398cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1399cdf0e10cSrcweir 1400cdf0e10cSrcweir bool bWasClipboardListening = ( NULL != mpImpl->mpClipboardListener ); 1401cdf0e10cSrcweir 1402cdf0e10cSrcweir if ( bWasClipboardListening ) 1403cdf0e10cSrcweir StopClipboardListening(); 1404cdf0e10cSrcweir 1405cdf0e10cSrcweir mxTransfer = rDataHelper.mxTransfer; 1406cdf0e10cSrcweir delete mpFormats, mpFormats = new DataFlavorExVector( *rDataHelper.mpFormats ); 1407cdf0e10cSrcweir delete mpObjDesc, mpObjDesc = new TransferableObjectDescriptor( *rDataHelper.mpObjDesc ); 1408cdf0e10cSrcweir mxClipboard = rDataHelper.mxClipboard; 1409cdf0e10cSrcweir 1410cdf0e10cSrcweir if ( bWasClipboardListening ) 1411cdf0e10cSrcweir StartClipboardListening(); 1412cdf0e10cSrcweir } 1413cdf0e10cSrcweir 1414cdf0e10cSrcweir return *this; 1415cdf0e10cSrcweir } 1416cdf0e10cSrcweir 1417cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1418cdf0e10cSrcweir 1419cdf0e10cSrcweir TransferableDataHelper::~TransferableDataHelper() 1420cdf0e10cSrcweir { 1421cdf0e10cSrcweir StopClipboardListening( ); 1422cdf0e10cSrcweir { 1423cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1424cdf0e10cSrcweir delete mpFormats, mpFormats = NULL; 1425cdf0e10cSrcweir delete mpObjDesc, mpObjDesc = NULL; 1426cdf0e10cSrcweir } 1427cdf0e10cSrcweir delete mpImpl; 1428cdf0e10cSrcweir } 1429cdf0e10cSrcweir 1430cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1431cdf0e10cSrcweir 1432cdf0e10cSrcweir void TransferableDataHelper::FillDataFlavorExVector( const Sequence< DataFlavor >& rDataFlavorSeq, 1433cdf0e10cSrcweir DataFlavorExVector& rDataFlavorExVector ) 1434cdf0e10cSrcweir { 1435cdf0e10cSrcweir try 1436cdf0e10cSrcweir { 1437cdf0e10cSrcweir Reference< XMultiServiceFactory > xFact( ::comphelper::getProcessServiceFactory() ); 1438cdf0e10cSrcweir Reference< XMimeContentTypeFactory > xMimeFact; 1439cdf0e10cSrcweir DataFlavorEx aFlavorEx; 1440cdf0e10cSrcweir const ::rtl::OUString aCharsetStr( ::rtl::OUString::createFromAscii( "charset" ) ); 1441cdf0e10cSrcweir 1442cdf0e10cSrcweir if( xFact.is() ) 1443cdf0e10cSrcweir xMimeFact = Reference< XMimeContentTypeFactory >( xFact->createInstance( ::rtl::OUString::createFromAscii( 1444cdf0e10cSrcweir "com.sun.star.datatransfer.MimeContentTypeFactory" ) ), 1445cdf0e10cSrcweir UNO_QUERY ); 1446cdf0e10cSrcweir 1447cdf0e10cSrcweir for( sal_Int32 i = 0; i < rDataFlavorSeq.getLength(); i++ ) 1448cdf0e10cSrcweir { 1449cdf0e10cSrcweir const DataFlavor& rFlavor = rDataFlavorSeq[ i ]; 1450cdf0e10cSrcweir Reference< XMimeContentType > xMimeType; 1451cdf0e10cSrcweir 1452cdf0e10cSrcweir try 1453cdf0e10cSrcweir { 1454cdf0e10cSrcweir if( xMimeFact.is() && rFlavor.MimeType.getLength() ) 1455cdf0e10cSrcweir xMimeType = xMimeFact->createMimeContentType( rFlavor.MimeType ); 1456cdf0e10cSrcweir } 1457cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1458cdf0e10cSrcweir { 1459cdf0e10cSrcweir 1460cdf0e10cSrcweir } 1461cdf0e10cSrcweir 1462cdf0e10cSrcweir aFlavorEx.MimeType = rFlavor.MimeType; 1463cdf0e10cSrcweir aFlavorEx.HumanPresentableName = rFlavor.HumanPresentableName; 1464cdf0e10cSrcweir aFlavorEx.DataType = rFlavor.DataType; 1465cdf0e10cSrcweir aFlavorEx.mnSotId = SotExchange::RegisterFormat( rFlavor ); 1466cdf0e10cSrcweir 1467cdf0e10cSrcweir rDataFlavorExVector.push_back( aFlavorEx ); 1468cdf0e10cSrcweir 1469cdf0e10cSrcweir // add additional formats for special mime types 1470*45fd3b9aSArmin Le Grand if(SOT_FORMATSTR_ID_BMP == aFlavorEx.mnSotId || SOT_FORMATSTR_ID_PNG == aFlavorEx.mnSotId) 1471cdf0e10cSrcweir { 1472cdf0e10cSrcweir if( SotExchange::GetFormatDataFlavor( SOT_FORMAT_BITMAP, aFlavorEx ) ) 1473cdf0e10cSrcweir { 1474cdf0e10cSrcweir aFlavorEx.mnSotId = SOT_FORMAT_BITMAP; 1475cdf0e10cSrcweir rDataFlavorExVector.push_back( aFlavorEx ); 1476cdf0e10cSrcweir } 1477cdf0e10cSrcweir } 1478cdf0e10cSrcweir else if( SOT_FORMATSTR_ID_WMF == aFlavorEx.mnSotId || SOT_FORMATSTR_ID_EMF == aFlavorEx.mnSotId ) 1479cdf0e10cSrcweir { 1480cdf0e10cSrcweir if( SotExchange::GetFormatDataFlavor( SOT_FORMAT_GDIMETAFILE, aFlavorEx ) ) 1481cdf0e10cSrcweir { 1482cdf0e10cSrcweir aFlavorEx.mnSotId = SOT_FORMAT_GDIMETAFILE; 1483cdf0e10cSrcweir rDataFlavorExVector.push_back( aFlavorEx ); 1484cdf0e10cSrcweir } 1485cdf0e10cSrcweir } 1486cdf0e10cSrcweir else if ( SOT_FORMATSTR_ID_HTML_SIMPLE == aFlavorEx.mnSotId ) 1487cdf0e10cSrcweir { 1488cdf0e10cSrcweir // #104735# HTML_SIMPLE may also be inserted without comments 1489cdf0e10cSrcweir aFlavorEx.mnSotId = SOT_FORMATSTR_ID_HTML_NO_COMMENT; 1490cdf0e10cSrcweir rDataFlavorExVector.push_back( aFlavorEx ); 1491cdf0e10cSrcweir } 1492cdf0e10cSrcweir else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "text/plain" ) ) ) 1493cdf0e10cSrcweir { 1494cdf0e10cSrcweir // add, if it is a UTF-8 byte buffer 1495cdf0e10cSrcweir if( xMimeType->hasParameter( aCharsetStr ) ) 1496cdf0e10cSrcweir { 1497cdf0e10cSrcweir const ::rtl::OUString aCharset( xMimeType->getParameterValue( aCharsetStr ) ); 1498cdf0e10cSrcweir 1499cdf0e10cSrcweir if( xMimeType->getParameterValue( aCharsetStr ).equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "unicode" ) ) || 1500cdf0e10cSrcweir xMimeType->getParameterValue( aCharsetStr ).equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "utf-16" ) ) ) 1501cdf0e10cSrcweir { 1502cdf0e10cSrcweir rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = FORMAT_STRING; 1503cdf0e10cSrcweir 1504cdf0e10cSrcweir } 1505cdf0e10cSrcweir } 1506cdf0e10cSrcweir } 1507cdf0e10cSrcweir else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "text/rtf" ) ) ) 1508cdf0e10cSrcweir { 1509cdf0e10cSrcweir rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = FORMAT_RTF; 1510cdf0e10cSrcweir } 1511cdf0e10cSrcweir else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "text/html" ) ) ) 1512cdf0e10cSrcweir 1513cdf0e10cSrcweir { 1514cdf0e10cSrcweir rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SOT_FORMATSTR_ID_HTML; 1515cdf0e10cSrcweir } 1516cdf0e10cSrcweir else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "text/uri-list" ) ) ) 1517cdf0e10cSrcweir { 1518cdf0e10cSrcweir rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SOT_FORMAT_FILE_LIST; 1519cdf0e10cSrcweir } 1520cdf0e10cSrcweir else if( xMimeType.is() && xMimeType->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "application/x-openoffice-objectdescriptor-xml" ) ) ) 1521cdf0e10cSrcweir { 1522cdf0e10cSrcweir rDataFlavorExVector[ rDataFlavorExVector.size() - 1 ].mnSotId = SOT_FORMATSTR_ID_OBJECTDESCRIPTOR; 1523cdf0e10cSrcweir } 1524cdf0e10cSrcweir } 1525cdf0e10cSrcweir } 1526cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1527cdf0e10cSrcweir { 1528cdf0e10cSrcweir } 1529cdf0e10cSrcweir } 1530cdf0e10cSrcweir 1531cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1532cdf0e10cSrcweir 1533cdf0e10cSrcweir void TransferableDataHelper::InitFormats() 1534cdf0e10cSrcweir { 1535cdf0e10cSrcweir ::vos::OGuard aSolarGuard( Application::GetSolarMutex() ); 1536cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1537cdf0e10cSrcweir 1538cdf0e10cSrcweir mpFormats->clear(); 1539cdf0e10cSrcweir delete mpObjDesc, mpObjDesc = new TransferableObjectDescriptor; 1540cdf0e10cSrcweir 1541cdf0e10cSrcweir if( mxTransfer.is() ) 1542cdf0e10cSrcweir { 1543cdf0e10cSrcweir TransferableDataHelper::FillDataFlavorExVector( mxTransfer->getTransferDataFlavors(), *mpFormats ); 1544cdf0e10cSrcweir 1545cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 1546cdf0e10cSrcweir 1547cdf0e10cSrcweir while( aIter != aEnd ) 1548cdf0e10cSrcweir { 1549cdf0e10cSrcweir if( SOT_FORMATSTR_ID_OBJECTDESCRIPTOR == aIter->mnSotId ) 1550cdf0e10cSrcweir { 1551cdf0e10cSrcweir ImplSetParameterString( *mpObjDesc, *aIter ); 1552cdf0e10cSrcweir aIter = aEnd; 1553cdf0e10cSrcweir } 1554cdf0e10cSrcweir else 1555cdf0e10cSrcweir ++aIter; 1556cdf0e10cSrcweir } 1557cdf0e10cSrcweir } 1558cdf0e10cSrcweir } 1559cdf0e10cSrcweir 1560cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1561cdf0e10cSrcweir 1562cdf0e10cSrcweir sal_Bool TransferableDataHelper::HasFormat( SotFormatStringId nFormat ) const 1563cdf0e10cSrcweir { 1564cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1565cdf0e10cSrcweir 1566cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 1567cdf0e10cSrcweir sal_Bool bRet = sal_False; 1568cdf0e10cSrcweir 1569cdf0e10cSrcweir while( aIter != aEnd ) 1570cdf0e10cSrcweir { 1571cdf0e10cSrcweir if( nFormat == (*aIter++).mnSotId ) 1572cdf0e10cSrcweir { 1573cdf0e10cSrcweir aIter = aEnd; 1574cdf0e10cSrcweir bRet = sal_True; 1575cdf0e10cSrcweir } 1576cdf0e10cSrcweir } 1577cdf0e10cSrcweir 1578cdf0e10cSrcweir return bRet; 1579cdf0e10cSrcweir } 1580cdf0e10cSrcweir 1581cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1582cdf0e10cSrcweir 1583cdf0e10cSrcweir sal_Bool TransferableDataHelper::HasFormat( const DataFlavor& rFlavor ) const 1584cdf0e10cSrcweir { 1585cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1586cdf0e10cSrcweir 1587cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 1588cdf0e10cSrcweir sal_Bool bRet = sal_False; 1589cdf0e10cSrcweir 1590cdf0e10cSrcweir while( aIter != aEnd ) 1591cdf0e10cSrcweir { 1592cdf0e10cSrcweir if( TransferableDataHelper::IsEqual( rFlavor, *aIter++ ) ) 1593cdf0e10cSrcweir { 1594cdf0e10cSrcweir aIter = aEnd; 1595cdf0e10cSrcweir bRet = sal_True; 1596cdf0e10cSrcweir } 1597cdf0e10cSrcweir } 1598cdf0e10cSrcweir 1599cdf0e10cSrcweir return bRet; 1600cdf0e10cSrcweir } 1601cdf0e10cSrcweir 1602cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1603cdf0e10cSrcweir 1604cdf0e10cSrcweir sal_uInt32 TransferableDataHelper::GetFormatCount() const 1605cdf0e10cSrcweir { 1606cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1607cdf0e10cSrcweir return mpFormats->size(); 1608cdf0e10cSrcweir } 1609cdf0e10cSrcweir 1610cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1611cdf0e10cSrcweir 1612cdf0e10cSrcweir 1613cdf0e10cSrcweir SotFormatStringId TransferableDataHelper::GetFormat( sal_uInt32 nFormat ) const 1614cdf0e10cSrcweir { 1615cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1616cdf0e10cSrcweir DBG_ASSERT( nFormat < mpFormats->size(), "TransferableDataHelper::GetFormat: invalid format index" ); 1617cdf0e10cSrcweir return( ( nFormat < mpFormats->size() ) ? (*mpFormats)[ nFormat ].mnSotId : 0 ); 1618cdf0e10cSrcweir } 1619cdf0e10cSrcweir 1620cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1621cdf0e10cSrcweir 1622cdf0e10cSrcweir DataFlavor TransferableDataHelper::GetFormatDataFlavor( sal_uInt32 nFormat ) const 1623cdf0e10cSrcweir { 1624cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1625cdf0e10cSrcweir DBG_ASSERT( nFormat < mpFormats->size(), "TransferableDataHelper::GetFormat: invalid format index" ); 1626cdf0e10cSrcweir 1627cdf0e10cSrcweir DataFlavor aRet; 1628cdf0e10cSrcweir 1629cdf0e10cSrcweir if( nFormat < mpFormats->size() ) 1630cdf0e10cSrcweir aRet = (*mpFormats)[ nFormat ]; 1631cdf0e10cSrcweir 1632cdf0e10cSrcweir return aRet; 1633cdf0e10cSrcweir } 1634cdf0e10cSrcweir 1635cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1636cdf0e10cSrcweir 1637cdf0e10cSrcweir Reference< XTransferable > TransferableDataHelper::GetXTransferable() const 1638cdf0e10cSrcweir { 1639cdf0e10cSrcweir Reference< XTransferable > xRet; 1640cdf0e10cSrcweir 1641cdf0e10cSrcweir if( mxTransfer.is() ) 1642cdf0e10cSrcweir { 1643cdf0e10cSrcweir try 1644cdf0e10cSrcweir { 1645cdf0e10cSrcweir xRet = mxTransfer; 1646cdf0e10cSrcweir 1647cdf0e10cSrcweir // do a dummy call to check, if this interface is valid (nasty) 1648cdf0e10cSrcweir Sequence< DataFlavor > aTestSeq( xRet->getTransferDataFlavors() ); 1649cdf0e10cSrcweir 1650cdf0e10cSrcweir } 1651cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1652cdf0e10cSrcweir { 1653cdf0e10cSrcweir xRet = Reference< XTransferable >(); 1654cdf0e10cSrcweir } 1655cdf0e10cSrcweir } 1656cdf0e10cSrcweir 1657cdf0e10cSrcweir return xRet; 1658cdf0e10cSrcweir } 1659cdf0e10cSrcweir 1660cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1661cdf0e10cSrcweir 1662cdf0e10cSrcweir Any TransferableDataHelper::GetAny( SotFormatStringId nFormat ) const 1663cdf0e10cSrcweir { 1664cdf0e10cSrcweir Any aReturn; 1665cdf0e10cSrcweir 1666cdf0e10cSrcweir DataFlavor aFlavor; 1667cdf0e10cSrcweir if ( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) ) 1668cdf0e10cSrcweir aReturn = GetAny( aFlavor ); 1669cdf0e10cSrcweir 1670cdf0e10cSrcweir return aReturn; 1671cdf0e10cSrcweir } 1672cdf0e10cSrcweir 1673cdf0e10cSrcweir 1674cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1675cdf0e10cSrcweir 1676cdf0e10cSrcweir Any TransferableDataHelper::GetAny( const DataFlavor& rFlavor ) const 1677cdf0e10cSrcweir { 1678cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 1679cdf0e10cSrcweir Any aRet; 1680cdf0e10cSrcweir 1681cdf0e10cSrcweir try 1682cdf0e10cSrcweir { 1683cdf0e10cSrcweir if( mxTransfer.is() ) 1684cdf0e10cSrcweir { 1685cdf0e10cSrcweir DataFlavorExVector::iterator aIter( mpFormats->begin() ), aEnd( mpFormats->end() ); 1686cdf0e10cSrcweir const SotFormatStringId nRequestFormat = SotExchange::GetFormat( rFlavor ); 1687cdf0e10cSrcweir 1688cdf0e10cSrcweir if( nRequestFormat ) 1689cdf0e10cSrcweir { 1690cdf0e10cSrcweir // try to get alien format first 1691cdf0e10cSrcweir while( aIter != aEnd ) 1692cdf0e10cSrcweir { 1693cdf0e10cSrcweir if( ( nRequestFormat == (*aIter).mnSotId ) && !rFlavor.MimeType.equalsIgnoreAsciiCase( (*aIter).MimeType ) ) 1694cdf0e10cSrcweir aRet = mxTransfer->getTransferData( *aIter ); 1695cdf0e10cSrcweir 1696cdf0e10cSrcweir if( aRet.hasValue() ) 1697cdf0e10cSrcweir aIter = aEnd; 1698cdf0e10cSrcweir else 1699cdf0e10cSrcweir aIter++; 1700cdf0e10cSrcweir } 1701cdf0e10cSrcweir } 1702cdf0e10cSrcweir 1703cdf0e10cSrcweir if( !aRet.hasValue() ) 1704cdf0e10cSrcweir aRet = mxTransfer->getTransferData( rFlavor ); 1705cdf0e10cSrcweir } 1706cdf0e10cSrcweir } 1707cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 1708cdf0e10cSrcweir { 1709cdf0e10cSrcweir } 1710cdf0e10cSrcweir 1711cdf0e10cSrcweir return aRet; 1712cdf0e10cSrcweir } 1713cdf0e10cSrcweir 1714cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1715cdf0e10cSrcweir 1716cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetString( SotFormatStringId nFormat, String& rStr ) 1717cdf0e10cSrcweir { 1718cdf0e10cSrcweir ::rtl::OUString aOUString; 1719cdf0e10cSrcweir sal_Bool bRet = GetString( nFormat, aOUString ); 1720cdf0e10cSrcweir 1721cdf0e10cSrcweir rStr = aOUString; 1722cdf0e10cSrcweir 1723cdf0e10cSrcweir return bRet; 1724cdf0e10cSrcweir } 1725cdf0e10cSrcweir 1726cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1727cdf0e10cSrcweir 1728cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetString( const DataFlavor& rFlavor, String& rStr ) 1729cdf0e10cSrcweir { 1730cdf0e10cSrcweir ::rtl::OUString aOUString; 1731cdf0e10cSrcweir sal_Bool bRet = GetString( rFlavor, aOUString ); 1732cdf0e10cSrcweir 1733cdf0e10cSrcweir rStr = aOUString; 1734cdf0e10cSrcweir 1735cdf0e10cSrcweir return bRet; 1736cdf0e10cSrcweir } 1737cdf0e10cSrcweir 1738cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1739cdf0e10cSrcweir 1740cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetString( SotFormatStringId nFormat, ::rtl::OUString& rStr ) 1741cdf0e10cSrcweir { 1742cdf0e10cSrcweir DataFlavor aFlavor; 1743cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetString( aFlavor, rStr ) ); 1744cdf0e10cSrcweir } 1745cdf0e10cSrcweir 1746cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1747cdf0e10cSrcweir 1748cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetString( const DataFlavor& rFlavor, ::rtl::OUString& rStr ) 1749cdf0e10cSrcweir { 1750cdf0e10cSrcweir Any aAny( GetAny( rFlavor ) ); 1751cdf0e10cSrcweir sal_Bool bRet = sal_False; 1752cdf0e10cSrcweir 1753cdf0e10cSrcweir if( aAny.hasValue() ) 1754cdf0e10cSrcweir { 1755cdf0e10cSrcweir ::rtl::OUString aOUString; 1756cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 1757cdf0e10cSrcweir 1758cdf0e10cSrcweir if( aAny >>= aOUString ) 1759cdf0e10cSrcweir { 1760cdf0e10cSrcweir rStr = aOUString; 1761cdf0e10cSrcweir bRet = sal_True; 1762cdf0e10cSrcweir } 1763cdf0e10cSrcweir else if( aAny >>= aSeq ) 1764cdf0e10cSrcweir { 1765cdf0e10cSrcweir 1766cdf0e10cSrcweir const sal_Char* pChars = reinterpret_cast< const sal_Char* >( aSeq.getConstArray() ); 1767cdf0e10cSrcweir sal_Int32 nLen = aSeq.getLength(); 1768cdf0e10cSrcweir 1769cdf0e10cSrcweir //JP 10.10.2001: 92930 - don't copy the last zero characterinto the string. 1770cdf0e10cSrcweir //DVO 2002-05-27: strip _all_ trailing zeros 1771cdf0e10cSrcweir while( nLen && ( 0 == *( pChars + nLen - 1 ) ) ) 1772cdf0e10cSrcweir --nLen; 1773cdf0e10cSrcweir 1774cdf0e10cSrcweir rStr = ::rtl::OUString( pChars, nLen, gsl_getSystemTextEncoding() ); 1775cdf0e10cSrcweir bRet = sal_True; 1776cdf0e10cSrcweir } 1777cdf0e10cSrcweir } 1778cdf0e10cSrcweir 1779cdf0e10cSrcweir return bRet; 1780cdf0e10cSrcweir } 1781cdf0e10cSrcweir 1782cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1783cdf0e10cSrcweir 1784*45fd3b9aSArmin Le Grand sal_Bool TransferableDataHelper::GetBitmapEx( SotFormatStringId nFormat, BitmapEx& rBmpEx ) 1785cdf0e10cSrcweir { 1786*45fd3b9aSArmin Le Grand if(FORMAT_BITMAP == nFormat) 1787*45fd3b9aSArmin Le Grand { 1788*45fd3b9aSArmin Le Grand // try to get PNG first 1789*45fd3b9aSArmin Le Grand DataFlavor aFlavor; 1790*45fd3b9aSArmin Le Grand 1791*45fd3b9aSArmin Le Grand if(SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_PNG, aFlavor)) 1792*45fd3b9aSArmin Le Grand { 1793*45fd3b9aSArmin Le Grand if(GetBitmapEx(aFlavor, rBmpEx)) 1794*45fd3b9aSArmin Le Grand { 1795*45fd3b9aSArmin Le Grand return true; 1796*45fd3b9aSArmin Le Grand } 1797*45fd3b9aSArmin Le Grand } 1798*45fd3b9aSArmin Le Grand } 1799*45fd3b9aSArmin Le Grand 1800*45fd3b9aSArmin Le Grand DataFlavor aFlavor; 1801*45fd3b9aSArmin Le Grand return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetBitmapEx( aFlavor, rBmpEx ) ); 1802cdf0e10cSrcweir } 1803cdf0e10cSrcweir 1804cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1805cdf0e10cSrcweir 1806*45fd3b9aSArmin Le Grand sal_Bool TransferableDataHelper::GetBitmapEx( const DataFlavor& rFlavor, BitmapEx& rBmpEx ) 1807cdf0e10cSrcweir { 1808*45fd3b9aSArmin Le Grand SotStorageStreamRef xStm; 1809*45fd3b9aSArmin Le Grand DataFlavor aSubstFlavor; 1810*45fd3b9aSArmin Le Grand bool bRet(GetSotStorageStream(rFlavor, xStm)); 1811cdf0e10cSrcweir 1812*45fd3b9aSArmin Le Grand if(!bRet && HasFormat(SOT_FORMATSTR_ID_PNG) && SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_PNG, aSubstFlavor)) 1813*45fd3b9aSArmin Le Grand { 1814*45fd3b9aSArmin Le Grand // when no direct success, try if PNG is available 1815*45fd3b9aSArmin Le Grand bRet = GetSotStorageStream(aSubstFlavor, xStm); 1816*45fd3b9aSArmin Le Grand } 1817cdf0e10cSrcweir 1818*45fd3b9aSArmin Le Grand if(!bRet && HasFormat(SOT_FORMATSTR_ID_BMP) && SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_BMP, aSubstFlavor)) 1819*45fd3b9aSArmin Le Grand { 1820*45fd3b9aSArmin Le Grand // when no direct success, try if BMP is available 1821*45fd3b9aSArmin Le Grand bRet = GetSotStorageStream(aSubstFlavor, xStm); 1822*45fd3b9aSArmin Le Grand } 1823cdf0e10cSrcweir 1824*45fd3b9aSArmin Le Grand if(bRet) 1825*45fd3b9aSArmin Le Grand { 1826*45fd3b9aSArmin Le Grand if(rFlavor.MimeType.equalsIgnoreAsciiCase(::rtl::OUString::createFromAscii("image/png"))) 1827*45fd3b9aSArmin Le Grand { 1828*45fd3b9aSArmin Le Grand // it's a PNG, import to BitmapEx 1829*45fd3b9aSArmin Le Grand ::vcl::PNGReader aPNGReader(*xStm); 1830cdf0e10cSrcweir 1831*45fd3b9aSArmin Le Grand rBmpEx = aPNGReader.Read(); 1832*45fd3b9aSArmin Le Grand } 1833*45fd3b9aSArmin Le Grand else 1834*45fd3b9aSArmin Le Grand { 1835*45fd3b9aSArmin Le Grand Bitmap aBitmap; 1836*45fd3b9aSArmin Le Grand Bitmap aMask; 1837cdf0e10cSrcweir 1838*45fd3b9aSArmin Le Grand // explicitely use Bitmap::Read with bFileHeader = sal_True 1839*45fd3b9aSArmin Le Grand ReadDIBV5(aBitmap, aMask, *xStm); 1840*45fd3b9aSArmin Le Grand 1841*45fd3b9aSArmin Le Grand if(aMask.IsEmpty()) 1842*45fd3b9aSArmin Le Grand { 1843*45fd3b9aSArmin Le Grand rBmpEx = aBitmap; 1844*45fd3b9aSArmin Le Grand } 1845*45fd3b9aSArmin Le Grand else 1846*45fd3b9aSArmin Le Grand { 1847*45fd3b9aSArmin Le Grand rBmpEx = BitmapEx(aBitmap, aMask); 1848*45fd3b9aSArmin Le Grand } 1849*45fd3b9aSArmin Le Grand } 1850*45fd3b9aSArmin Le Grand 1851*45fd3b9aSArmin Le Grand bRet = (ERRCODE_NONE == xStm->GetError()); 1852*45fd3b9aSArmin Le Grand 1853*45fd3b9aSArmin Le Grand /* SJ: #110748# At the moment we are having problems with DDB inserted as DIB. The 1854*45fd3b9aSArmin Le Grand problem is, that some graphics are inserted much too big because the nXPelsPerMeter 1855*45fd3b9aSArmin Le Grand and nYPelsPerMeter of the bitmap fileheader isn't including the correct value. 1856*45fd3b9aSArmin Le Grand Due to this reason the following code assumes that bitmaps with a logical size 1857*45fd3b9aSArmin Le Grand greater than 50 cm aren't having the correct mapmode set. 1858*45fd3b9aSArmin Le Grand 1859*45fd3b9aSArmin Le Grand The following code should be removed if DDBs and DIBs are supported via clipboard 1860*45fd3b9aSArmin Le Grand properly. 1861*45fd3b9aSArmin Le Grand */ 1862*45fd3b9aSArmin Le Grand if(bRet) 1863*45fd3b9aSArmin Le Grand { 1864*45fd3b9aSArmin Le Grand const MapMode aMapMode(rBmpEx.GetPrefMapMode()); 1865*45fd3b9aSArmin Le Grand 1866*45fd3b9aSArmin Le Grand if(MAP_PIXEL != aMapMode.GetMapUnit()) 1867*45fd3b9aSArmin Le Grand { 1868*45fd3b9aSArmin Le Grand const Size aSize(OutputDevice::LogicToLogic(rBmpEx.GetPrefSize(), aMapMode, MAP_100TH_MM)); 1869*45fd3b9aSArmin Le Grand 1870*45fd3b9aSArmin Le Grand if((aSize.Width() > 5000) || (aSize.Height() > 5000)) 1871*45fd3b9aSArmin Le Grand { 1872*45fd3b9aSArmin Le Grand rBmpEx.SetPrefMapMode(MAP_PIXEL); 1873*45fd3b9aSArmin Le Grand } 1874*45fd3b9aSArmin Le Grand } 1875*45fd3b9aSArmin Le Grand } 1876*45fd3b9aSArmin Le Grand } 1877*45fd3b9aSArmin Le Grand 1878*45fd3b9aSArmin Le Grand return bRet; 1879cdf0e10cSrcweir } 1880cdf0e10cSrcweir 1881cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1882cdf0e10cSrcweir 1883cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetGDIMetaFile( SotFormatStringId nFormat, GDIMetaFile& rMtf ) 1884cdf0e10cSrcweir { 1885cdf0e10cSrcweir DataFlavor aFlavor; 1886cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetGDIMetaFile( aFlavor, rMtf ) ); 1887cdf0e10cSrcweir } 1888cdf0e10cSrcweir 1889cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1890cdf0e10cSrcweir 1891cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetGDIMetaFile( const DataFlavor& rFlavor, GDIMetaFile& rMtf ) 1892cdf0e10cSrcweir { 1893cdf0e10cSrcweir SotStorageStreamRef xStm; 1894cdf0e10cSrcweir DataFlavor aSubstFlavor; 1895cdf0e10cSrcweir sal_Bool bRet = sal_False; 1896cdf0e10cSrcweir 1897cdf0e10cSrcweir if( GetSotStorageStream( rFlavor, xStm ) ) 1898cdf0e10cSrcweir { 1899cdf0e10cSrcweir *xStm >> rMtf; 1900cdf0e10cSrcweir bRet = ( xStm->GetError() == ERRCODE_NONE ); 1901cdf0e10cSrcweir } 1902cdf0e10cSrcweir 1903cdf0e10cSrcweir if( !bRet && 1904cdf0e10cSrcweir HasFormat( SOT_FORMATSTR_ID_EMF ) && 1905cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_EMF, aSubstFlavor ) && 1906cdf0e10cSrcweir GetSotStorageStream( aSubstFlavor, xStm ) ) 1907cdf0e10cSrcweir { 1908cdf0e10cSrcweir Graphic aGraphic; 1909cdf0e10cSrcweir 1910cdf0e10cSrcweir if( GraphicConverter::Import( *xStm, aGraphic ) == ERRCODE_NONE ) 1911cdf0e10cSrcweir { 1912cdf0e10cSrcweir rMtf = aGraphic.GetGDIMetaFile(); 1913cdf0e10cSrcweir bRet = sal_True; 1914cdf0e10cSrcweir } 1915cdf0e10cSrcweir } 1916cdf0e10cSrcweir 1917cdf0e10cSrcweir if( !bRet && 1918cdf0e10cSrcweir HasFormat( SOT_FORMATSTR_ID_WMF ) && 1919cdf0e10cSrcweir SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_WMF, aSubstFlavor ) && 1920cdf0e10cSrcweir GetSotStorageStream( aSubstFlavor, xStm ) ) 1921cdf0e10cSrcweir { 1922cdf0e10cSrcweir Graphic aGraphic; 1923cdf0e10cSrcweir 1924cdf0e10cSrcweir if( GraphicConverter::Import( *xStm, aGraphic ) == ERRCODE_NONE ) 1925cdf0e10cSrcweir { 1926cdf0e10cSrcweir rMtf = aGraphic.GetGDIMetaFile(); 1927cdf0e10cSrcweir bRet = sal_True; 1928cdf0e10cSrcweir } 1929cdf0e10cSrcweir } 1930cdf0e10cSrcweir 1931cdf0e10cSrcweir return bRet; 1932cdf0e10cSrcweir } 1933cdf0e10cSrcweir 1934cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1935cdf0e10cSrcweir 1936cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetGraphic( SotFormatStringId nFormat, Graphic& rGraphic ) 1937cdf0e10cSrcweir { 1938*45fd3b9aSArmin Le Grand if(FORMAT_BITMAP == nFormat) 1939*45fd3b9aSArmin Le Grand { 1940*45fd3b9aSArmin Le Grand // try to get PNG first 1941*45fd3b9aSArmin Le Grand DataFlavor aFlavor; 1942*45fd3b9aSArmin Le Grand 1943*45fd3b9aSArmin Le Grand if(SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_PNG, aFlavor)) 1944*45fd3b9aSArmin Le Grand { 1945*45fd3b9aSArmin Le Grand if(GetGraphic(aFlavor, rGraphic)) 1946*45fd3b9aSArmin Le Grand { 1947*45fd3b9aSArmin Le Grand return true; 1948*45fd3b9aSArmin Le Grand } 1949*45fd3b9aSArmin Le Grand } 1950*45fd3b9aSArmin Le Grand } 1951*45fd3b9aSArmin Le Grand 1952*45fd3b9aSArmin Le Grand DataFlavor aFlavor; 1953*45fd3b9aSArmin Le Grand return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetGraphic( aFlavor, rGraphic ) ); 1954cdf0e10cSrcweir } 1955cdf0e10cSrcweir 1956cdf0e10cSrcweir // ----------------------------------------------------------------------------- 1957cdf0e10cSrcweir 1958cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetGraphic( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, Graphic& rGraphic ) 1959cdf0e10cSrcweir { 1960cdf0e10cSrcweir DataFlavor aFlavor; 1961cdf0e10cSrcweir sal_Bool bRet = sal_False; 1962cdf0e10cSrcweir 1963*45fd3b9aSArmin Le Grand if(SotExchange::GetFormatDataFlavor(SOT_FORMATSTR_ID_PNG, aFlavor) && 1964*45fd3b9aSArmin Le Grand TransferableDataHelper::IsEqual(aFlavor, rFlavor)) 1965*45fd3b9aSArmin Le Grand { 1966*45fd3b9aSArmin Le Grand // try to get PNG first 1967*45fd3b9aSArmin Le Grand BitmapEx aBmpEx; 1968*45fd3b9aSArmin Le Grand 1969*45fd3b9aSArmin Le Grand if( ( bRet = GetBitmapEx( aFlavor, aBmpEx ) ) == sal_True ) 1970*45fd3b9aSArmin Le Grand rGraphic = aBmpEx; 1971*45fd3b9aSArmin Le Grand } 1972*45fd3b9aSArmin Le Grand else if(SotExchange::GetFormatDataFlavor( SOT_FORMAT_BITMAP, aFlavor ) && 1973cdf0e10cSrcweir TransferableDataHelper::IsEqual( aFlavor, rFlavor ) ) 1974cdf0e10cSrcweir { 1975*45fd3b9aSArmin Le Grand BitmapEx aBmpEx; 1976cdf0e10cSrcweir 1977*45fd3b9aSArmin Le Grand if( ( bRet = GetBitmapEx( aFlavor, aBmpEx ) ) == sal_True ) 1978*45fd3b9aSArmin Le Grand rGraphic = aBmpEx; 1979cdf0e10cSrcweir } 1980cdf0e10cSrcweir else if( SotExchange::GetFormatDataFlavor( SOT_FORMAT_GDIMETAFILE, aFlavor ) && 1981cdf0e10cSrcweir TransferableDataHelper::IsEqual( aFlavor, rFlavor ) ) 1982cdf0e10cSrcweir { 1983cdf0e10cSrcweir GDIMetaFile aMtf; 1984cdf0e10cSrcweir 1985cdf0e10cSrcweir if( ( bRet = GetGDIMetaFile( aFlavor, aMtf ) ) == sal_True ) 1986cdf0e10cSrcweir rGraphic = aMtf; 1987cdf0e10cSrcweir } 1988cdf0e10cSrcweir else 1989cdf0e10cSrcweir { 1990cdf0e10cSrcweir SotStorageStreamRef xStm; 1991cdf0e10cSrcweir 1992cdf0e10cSrcweir if( GetSotStorageStream( rFlavor, xStm ) ) 1993cdf0e10cSrcweir { 1994cdf0e10cSrcweir *xStm >> rGraphic; 1995cdf0e10cSrcweir bRet = ( xStm->GetError() == ERRCODE_NONE ); 1996cdf0e10cSrcweir } 1997cdf0e10cSrcweir } 1998cdf0e10cSrcweir 1999cdf0e10cSrcweir return bRet; 2000cdf0e10cSrcweir } 2001cdf0e10cSrcweir 2002cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2003cdf0e10cSrcweir 2004cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetImageMap( SotFormatStringId nFormat, ImageMap& rIMap ) 2005cdf0e10cSrcweir { 2006cdf0e10cSrcweir DataFlavor aFlavor; 2007cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetImageMap( aFlavor, rIMap ) ); 2008cdf0e10cSrcweir } 2009cdf0e10cSrcweir 2010cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2011cdf0e10cSrcweir 2012cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetImageMap( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, ImageMap& rIMap ) 2013cdf0e10cSrcweir { 2014cdf0e10cSrcweir SotStorageStreamRef xStm; 2015cdf0e10cSrcweir sal_Bool bRet = GetSotStorageStream( rFlavor, xStm ); 2016cdf0e10cSrcweir 2017cdf0e10cSrcweir if( bRet ) 2018cdf0e10cSrcweir { 2019cdf0e10cSrcweir rIMap.Read( *xStm, String() ); 2020cdf0e10cSrcweir bRet = ( xStm->GetError() == ERRCODE_NONE ); 2021cdf0e10cSrcweir } 2022cdf0e10cSrcweir 2023cdf0e10cSrcweir return bRet; 2024cdf0e10cSrcweir } 2025cdf0e10cSrcweir 2026cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2027cdf0e10cSrcweir 2028cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetTransferableObjectDescriptor( SotFormatStringId nFormat, TransferableObjectDescriptor& rDesc ) 2029cdf0e10cSrcweir { 2030cdf0e10cSrcweir DataFlavor aFlavor; 2031cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetTransferableObjectDescriptor( aFlavor, rDesc ) ); 2032cdf0e10cSrcweir } 2033cdf0e10cSrcweir 2034cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2035cdf0e10cSrcweir 2036cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetTransferableObjectDescriptor( const ::com::sun::star::datatransfer::DataFlavor&, TransferableObjectDescriptor& rDesc ) 2037cdf0e10cSrcweir { 2038cdf0e10cSrcweir rDesc = *mpObjDesc; 2039cdf0e10cSrcweir return true; 2040cdf0e10cSrcweir } 2041cdf0e10cSrcweir 2042cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2043cdf0e10cSrcweir 2044cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetINetBookmark( SotFormatStringId nFormat, INetBookmark& rBmk ) 2045cdf0e10cSrcweir { 2046cdf0e10cSrcweir DataFlavor aFlavor; 2047cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetINetBookmark( aFlavor, rBmk ) ); 2048cdf0e10cSrcweir } 2049cdf0e10cSrcweir 2050cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2051cdf0e10cSrcweir 2052cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetINetBookmark( const ::com::sun::star::datatransfer::DataFlavor& rFlavor, INetBookmark& rBmk ) 2053cdf0e10cSrcweir { 2054cdf0e10cSrcweir sal_Bool bRet = sal_False; 2055cdf0e10cSrcweir if( HasFormat( rFlavor )) 2056cdf0e10cSrcweir { 2057cdf0e10cSrcweir const SotFormatStringId nFormat = SotExchange::GetFormat( rFlavor ); 2058cdf0e10cSrcweir switch( nFormat ) 2059cdf0e10cSrcweir { 2060cdf0e10cSrcweir case( SOT_FORMATSTR_ID_SOLK ): 2061cdf0e10cSrcweir case( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ): 2062cdf0e10cSrcweir { 2063cdf0e10cSrcweir String aString; 2064cdf0e10cSrcweir if( GetString( rFlavor, aString ) ) 2065cdf0e10cSrcweir { 2066cdf0e10cSrcweir if( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR == nFormat ) 2067cdf0e10cSrcweir { 2068cdf0e10cSrcweir rBmk = INetBookmark( aString, aString ); 2069cdf0e10cSrcweir bRet = sal_True; 2070cdf0e10cSrcweir } 2071cdf0e10cSrcweir else 2072cdf0e10cSrcweir { 2073cdf0e10cSrcweir String aURL, aDesc; 2074cdf0e10cSrcweir sal_uInt16 nStart = aString.Search( '@' ), nLen = (sal_uInt16) aString.ToInt32(); 2075cdf0e10cSrcweir 2076cdf0e10cSrcweir if( !nLen && aString.GetChar( 0 ) != '0' ) 2077cdf0e10cSrcweir { 2078cdf0e10cSrcweir DBG_WARNING( "SOLK: 1. len=0" ); 2079cdf0e10cSrcweir } 2080cdf0e10cSrcweir if( nStart == STRING_NOTFOUND || nLen > aString.Len() - nStart - 3 ) 2081cdf0e10cSrcweir { 2082cdf0e10cSrcweir DBG_WARNING( "SOLK: 1. illegal start or wrong len" ); 2083cdf0e10cSrcweir } 2084cdf0e10cSrcweir aURL = aString.Copy( nStart + 1, nLen ); 2085cdf0e10cSrcweir 2086cdf0e10cSrcweir aString.Erase( 0, nStart + 1 + nLen ); 2087cdf0e10cSrcweir nStart = aString.Search( '@' ); 2088cdf0e10cSrcweir nLen = (sal_uInt16) aString.ToInt32(); 2089cdf0e10cSrcweir 2090cdf0e10cSrcweir if( !nLen && aString.GetChar( 0 ) != '0' ) 2091cdf0e10cSrcweir { 2092cdf0e10cSrcweir DBG_WARNING( "SOLK: 2. len=0" ); 2093cdf0e10cSrcweir } 2094cdf0e10cSrcweir if( nStart == STRING_NOTFOUND || nLen > aString.Len() - nStart - 1 ) 2095cdf0e10cSrcweir { 2096cdf0e10cSrcweir DBG_WARNING( "SOLK: 2. illegal start or wrong len" ); 2097cdf0e10cSrcweir } 2098cdf0e10cSrcweir aDesc = aString.Copy( nStart+1, nLen ); 2099cdf0e10cSrcweir 2100cdf0e10cSrcweir rBmk = INetBookmark( aURL, aDesc ); 2101cdf0e10cSrcweir bRet = sal_True; 2102cdf0e10cSrcweir } 2103cdf0e10cSrcweir } 2104cdf0e10cSrcweir } 2105cdf0e10cSrcweir break; 2106cdf0e10cSrcweir 2107cdf0e10cSrcweir case( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK ): 2108cdf0e10cSrcweir { 2109cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 2110cdf0e10cSrcweir 2111cdf0e10cSrcweir if( GetSequence( rFlavor, aSeq ) && ( 2048 == aSeq.getLength() ) ) 2112cdf0e10cSrcweir { 2113cdf0e10cSrcweir rBmk = INetBookmark( String( reinterpret_cast< const sal_Char* >( aSeq.getConstArray() ), gsl_getSystemTextEncoding() ), 2114cdf0e10cSrcweir String( reinterpret_cast< const sal_Char* >( aSeq.getConstArray() ) + 1024, gsl_getSystemTextEncoding() ) ); 2115cdf0e10cSrcweir bRet = sal_True; 2116cdf0e10cSrcweir } 2117cdf0e10cSrcweir } 2118cdf0e10cSrcweir break; 2119cdf0e10cSrcweir 2120cdf0e10cSrcweir #ifdef WNT 2121cdf0e10cSrcweir case SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR: 2122cdf0e10cSrcweir { 2123cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 2124cdf0e10cSrcweir 2125cdf0e10cSrcweir if( GetSequence( rFlavor, aSeq ) && aSeq.getLength() ) 2126cdf0e10cSrcweir { 2127cdf0e10cSrcweir FILEGROUPDESCRIPTOR* pFDesc = (FILEGROUPDESCRIPTOR*) aSeq.getConstArray(); 2128cdf0e10cSrcweir 2129cdf0e10cSrcweir if( pFDesc->cItems ) 2130cdf0e10cSrcweir { 2131cdf0e10cSrcweir ByteString aDesc( pFDesc->fgd[ 0 ].cFileName ); 2132cdf0e10cSrcweir rtl_TextEncoding eTextEncoding = gsl_getSystemTextEncoding(); 2133cdf0e10cSrcweir 2134cdf0e10cSrcweir if( ( aDesc.Len() > 4 ) && aDesc.Copy( aDesc.Len() - 4 ).EqualsIgnoreCaseAscii( ".URL" ) ) 2135cdf0e10cSrcweir { 2136cdf0e10cSrcweir SvStream* pStream = ::utl::UcbStreamHelper::CreateStream( INetURLObject( String( aDesc, eTextEncoding ) ).GetMainURL( INetURLObject::NO_DECODE ), 2137cdf0e10cSrcweir STREAM_STD_READ ); 2138cdf0e10cSrcweir 2139cdf0e10cSrcweir if( !pStream || pStream->GetError() ) 2140cdf0e10cSrcweir { 2141cdf0e10cSrcweir DataFlavor aFileContentFlavor; 2142cdf0e10cSrcweir 2143cdf0e10cSrcweir aSeq.realloc( 0 ); 2144cdf0e10cSrcweir delete pStream; 2145cdf0e10cSrcweir 2146cdf0e10cSrcweir if( SotExchange::GetFormatDataFlavor( SOT_FORMATSTR_ID_FILECONTENT, aFileContentFlavor ) && 2147cdf0e10cSrcweir GetSequence( aFileContentFlavor, aSeq ) && aSeq.getLength() ) 2148cdf0e10cSrcweir { 2149cdf0e10cSrcweir pStream = new SvMemoryStream( (sal_Char*) aSeq.getConstArray(), aSeq.getLength(), STREAM_STD_READ ); 2150cdf0e10cSrcweir } 2151cdf0e10cSrcweir else 2152cdf0e10cSrcweir pStream = NULL; 2153cdf0e10cSrcweir } 2154cdf0e10cSrcweir 2155cdf0e10cSrcweir if( pStream ) 2156cdf0e10cSrcweir { 2157cdf0e10cSrcweir ByteString aLine; 2158cdf0e10cSrcweir sal_Bool bSttFnd = sal_False; 2159cdf0e10cSrcweir 2160cdf0e10cSrcweir while( pStream->ReadLine( aLine ) ) 2161cdf0e10cSrcweir { 2162cdf0e10cSrcweir if( aLine.EqualsIgnoreCaseAscii( "[InternetShortcut]" ) ) 2163cdf0e10cSrcweir bSttFnd = sal_True; 2164cdf0e10cSrcweir else if( bSttFnd && aLine.Copy( 0, 4 ).EqualsIgnoreCaseAscii( "URL=" ) ) 2165cdf0e10cSrcweir { 2166cdf0e10cSrcweir rBmk = INetBookmark( String( aLine.Erase( 0, 4 ), eTextEncoding ), 2167cdf0e10cSrcweir String( aDesc.Erase( aDesc.Len() - 4 ), eTextEncoding ) ); 2168cdf0e10cSrcweir bRet = sal_True; 2169cdf0e10cSrcweir break; 2170cdf0e10cSrcweir } 2171cdf0e10cSrcweir } 2172cdf0e10cSrcweir 2173cdf0e10cSrcweir delete pStream; 2174cdf0e10cSrcweir } 2175cdf0e10cSrcweir } 2176cdf0e10cSrcweir } 2177cdf0e10cSrcweir } 2178cdf0e10cSrcweir } 2179cdf0e10cSrcweir break; 2180cdf0e10cSrcweir #endif 2181cdf0e10cSrcweir 2182cdf0e10cSrcweir } 2183cdf0e10cSrcweir } 2184cdf0e10cSrcweir return bRet; 2185cdf0e10cSrcweir } 2186cdf0e10cSrcweir 2187cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2188cdf0e10cSrcweir 2189cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetINetImage( SotFormatStringId nFormat, 2190cdf0e10cSrcweir INetImage& rINtImg ) 2191cdf0e10cSrcweir { 2192cdf0e10cSrcweir DataFlavor aFlavor; 2193cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetINetImage( aFlavor, rINtImg ) ); 2194cdf0e10cSrcweir } 2195cdf0e10cSrcweir 2196cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2197cdf0e10cSrcweir 2198cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetINetImage( 2199cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& rFlavor, 2200cdf0e10cSrcweir INetImage& rINtImg ) 2201cdf0e10cSrcweir { 2202cdf0e10cSrcweir SotStorageStreamRef xStm; 2203cdf0e10cSrcweir sal_Bool bRet = GetSotStorageStream( rFlavor, xStm ); 2204cdf0e10cSrcweir 2205cdf0e10cSrcweir if( bRet ) 2206cdf0e10cSrcweir bRet = rINtImg.Read( *xStm, SotExchange::GetFormat( rFlavor ) ); 2207cdf0e10cSrcweir return bRet; 2208cdf0e10cSrcweir } 2209cdf0e10cSrcweir 2210cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2211cdf0e10cSrcweir 2212cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetFileList( SotFormatStringId nFormat, 2213cdf0e10cSrcweir FileList& rFileList ) 2214cdf0e10cSrcweir { 2215cdf0e10cSrcweir DataFlavor aFlavor; 2216cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetFileList( aFlavor, rFileList ) ); 2217cdf0e10cSrcweir } 2218cdf0e10cSrcweir 2219cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2220cdf0e10cSrcweir 2221cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetFileList( 2222cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor&, 2223cdf0e10cSrcweir FileList& rFileList ) 2224cdf0e10cSrcweir { 2225cdf0e10cSrcweir SotStorageStreamRef xStm; 2226cdf0e10cSrcweir sal_Bool bRet = sal_False; 2227cdf0e10cSrcweir 2228cdf0e10cSrcweir for( sal_uInt32 i = 0, nFormatCount = GetFormatCount(); ( i < nFormatCount ) && !bRet; ++i ) 2229cdf0e10cSrcweir { 2230cdf0e10cSrcweir if( SOT_FORMAT_FILE_LIST == GetFormat( i ) ) 2231cdf0e10cSrcweir { 2232cdf0e10cSrcweir const DataFlavor aFlavor( GetFormatDataFlavor( i ) ); 2233cdf0e10cSrcweir 2234cdf0e10cSrcweir if( GetSotStorageStream( aFlavor, xStm ) ) 2235cdf0e10cSrcweir { 2236cdf0e10cSrcweir if( aFlavor.MimeType.indexOf( ::rtl::OUString::createFromAscii( "text/uri-list" ) ) > -1 ) 2237cdf0e10cSrcweir { 2238cdf0e10cSrcweir ByteString aByteString; 2239cdf0e10cSrcweir 2240cdf0e10cSrcweir while( xStm->ReadLine( aByteString ) ) 2241cdf0e10cSrcweir if( aByteString.Len() && aByteString.GetChar( 0 ) != '#' ) 2242cdf0e10cSrcweir rFileList.AppendFile( String( aByteString, RTL_TEXTENCODING_UTF8 ) ); 2243cdf0e10cSrcweir 2244cdf0e10cSrcweir bRet = sal_True; 2245cdf0e10cSrcweir } 2246cdf0e10cSrcweir else 2247cdf0e10cSrcweir bRet = ( ( *xStm >> rFileList ).GetError() == ERRCODE_NONE ); 2248cdf0e10cSrcweir } 2249cdf0e10cSrcweir } 2250cdf0e10cSrcweir } 2251cdf0e10cSrcweir 2252cdf0e10cSrcweir return bRet; 2253cdf0e10cSrcweir } 2254cdf0e10cSrcweir 2255cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2256cdf0e10cSrcweir 2257cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetSequence( SotFormatStringId nFormat, Sequence< sal_Int8 >& rSeq ) 2258cdf0e10cSrcweir { 2259cdf0e10cSrcweir DataFlavor aFlavor; 2260cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetSequence( aFlavor, rSeq ) ); 2261cdf0e10cSrcweir } 2262cdf0e10cSrcweir 2263cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2264cdf0e10cSrcweir 2265cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetSequence( const DataFlavor& rFlavor, Sequence< sal_Int8 >& rSeq ) 2266cdf0e10cSrcweir { 2267cdf0e10cSrcweir #ifdef DEBUG 2268cdf0e10cSrcweir fprintf( stderr, "TransferableDataHelper requests sequence of data\n" ); 2269cdf0e10cSrcweir #endif 2270cdf0e10cSrcweir 2271cdf0e10cSrcweir const Any aAny( GetAny( rFlavor ) ); 2272cdf0e10cSrcweir return( aAny.hasValue() && ( aAny >>= rSeq ) ); 2273cdf0e10cSrcweir } 2274cdf0e10cSrcweir 2275cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2276cdf0e10cSrcweir 2277cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetSotStorageStream( SotFormatStringId nFormat, SotStorageStreamRef& rxStream ) 2278cdf0e10cSrcweir { 2279cdf0e10cSrcweir DataFlavor aFlavor; 2280cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetSotStorageStream( aFlavor, rxStream ) ); 2281cdf0e10cSrcweir } 2282cdf0e10cSrcweir 2283cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2284cdf0e10cSrcweir 2285cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetSotStorageStream( const DataFlavor& rFlavor, SotStorageStreamRef& rxStream ) 2286cdf0e10cSrcweir { 2287cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 2288cdf0e10cSrcweir sal_Bool bRet = GetSequence( rFlavor, aSeq ); 2289cdf0e10cSrcweir 2290cdf0e10cSrcweir if( bRet ) 2291cdf0e10cSrcweir { 2292cdf0e10cSrcweir rxStream = new SotStorageStream( String() ); 2293cdf0e10cSrcweir rxStream->Write( aSeq.getConstArray(), aSeq.getLength() ); 2294cdf0e10cSrcweir rxStream->Seek( 0 ); 2295cdf0e10cSrcweir } 2296cdf0e10cSrcweir 2297cdf0e10cSrcweir return bRet; 2298cdf0e10cSrcweir } 2299cdf0e10cSrcweir 2300cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetInputStream( SotFormatStringId nFormat, Reference < XInputStream >& rxStream ) 2301cdf0e10cSrcweir { 2302cdf0e10cSrcweir DataFlavor aFlavor; 2303cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetInputStream( aFlavor, rxStream ) ); 2304cdf0e10cSrcweir } 2305cdf0e10cSrcweir 2306cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2307cdf0e10cSrcweir 2308cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetInputStream( const DataFlavor& rFlavor, Reference < XInputStream >& rxStream ) 2309cdf0e10cSrcweir { 2310cdf0e10cSrcweir Sequence< sal_Int8 > aSeq; 2311cdf0e10cSrcweir sal_Bool bRet = GetSequence( rFlavor, aSeq ); 2312cdf0e10cSrcweir 2313cdf0e10cSrcweir if( bRet ) 2314cdf0e10cSrcweir rxStream = new ::comphelper::SequenceInputStream( aSeq ); 2315cdf0e10cSrcweir 2316cdf0e10cSrcweir return bRet; 2317cdf0e10cSrcweir } 2318cdf0e10cSrcweir 2319cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2320cdf0e10cSrcweir 2321cdf0e10cSrcweir 2322cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetInterface( SotFormatStringId nFormat, Reference< XInterface >& rIf ) 2323cdf0e10cSrcweir { 2324cdf0e10cSrcweir DataFlavor aFlavor; 2325cdf0e10cSrcweir return( SotExchange::GetFormatDataFlavor( nFormat, aFlavor ) && GetInterface( aFlavor, rIf ) ); 2326cdf0e10cSrcweir } 2327cdf0e10cSrcweir 2328cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2329cdf0e10cSrcweir 2330cdf0e10cSrcweir sal_Bool TransferableDataHelper::GetInterface( const DataFlavor& rFlavor, Reference< XInterface >& rIf ) 2331cdf0e10cSrcweir { 2332cdf0e10cSrcweir const Any aAny( GetAny( rFlavor ) ); 2333cdf0e10cSrcweir return( aAny.hasValue() && ( aAny >>= rIf ) ); 2334cdf0e10cSrcweir } 2335cdf0e10cSrcweir 2336cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2337cdf0e10cSrcweir void TransferableDataHelper::Rebind( const Reference< XTransferable >& _rxNewContent ) 2338cdf0e10cSrcweir { 2339cdf0e10cSrcweir mxTransfer = _rxNewContent; 2340cdf0e10cSrcweir InitFormats(); 2341cdf0e10cSrcweir } 2342cdf0e10cSrcweir 2343cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2344cdf0e10cSrcweir 2345cdf0e10cSrcweir sal_Bool TransferableDataHelper::StartClipboardListening( ) 2346cdf0e10cSrcweir { 2347cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 2348cdf0e10cSrcweir 2349cdf0e10cSrcweir StopClipboardListening( ); 2350cdf0e10cSrcweir 2351cdf0e10cSrcweir mpImpl->mpClipboardListener = new TransferableClipboardNotifier( mxClipboard, *this, mpImpl->maMutex ); 2352cdf0e10cSrcweir mpImpl->mpClipboardListener->acquire(); 2353cdf0e10cSrcweir 2354cdf0e10cSrcweir return mpImpl->mpClipboardListener->isListening(); 2355cdf0e10cSrcweir } 2356cdf0e10cSrcweir 2357cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2358cdf0e10cSrcweir 2359cdf0e10cSrcweir void TransferableDataHelper::StopClipboardListening( ) 2360cdf0e10cSrcweir { 2361cdf0e10cSrcweir ::osl::MutexGuard aGuard( mpImpl->maMutex ); 2362cdf0e10cSrcweir 2363cdf0e10cSrcweir if ( mpImpl->mpClipboardListener ) 2364cdf0e10cSrcweir { 2365cdf0e10cSrcweir mpImpl->mpClipboardListener->dispose(); 2366cdf0e10cSrcweir mpImpl->mpClipboardListener->release(); 2367cdf0e10cSrcweir mpImpl->mpClipboardListener = NULL; 2368cdf0e10cSrcweir } 2369cdf0e10cSrcweir } 2370cdf0e10cSrcweir 2371cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2372cdf0e10cSrcweir 2373cdf0e10cSrcweir TransferableDataHelper TransferableDataHelper::CreateFromSystemClipboard( Window * pWindow ) 2374cdf0e10cSrcweir { 2375cdf0e10cSrcweir DBG_ASSERT( pWindow, "Window pointer is NULL" ); 2376cdf0e10cSrcweir 2377cdf0e10cSrcweir Reference< XClipboard > xClipboard; 2378cdf0e10cSrcweir TransferableDataHelper aRet; 2379cdf0e10cSrcweir 2380cdf0e10cSrcweir if( pWindow ) 2381cdf0e10cSrcweir xClipboard = pWindow->GetClipboard(); 2382cdf0e10cSrcweir 2383cdf0e10cSrcweir if( xClipboard.is() ) 2384cdf0e10cSrcweir { 2385cdf0e10cSrcweir try 2386cdf0e10cSrcweir 2387cdf0e10cSrcweir { 2388cdf0e10cSrcweir Reference< XTransferable > xTransferable( xClipboard->getContents() ); 2389cdf0e10cSrcweir 2390cdf0e10cSrcweir if( xTransferable.is() ) 2391cdf0e10cSrcweir { 2392cdf0e10cSrcweir aRet = TransferableDataHelper( xTransferable ); 2393cdf0e10cSrcweir aRet.mxClipboard = xClipboard; 2394cdf0e10cSrcweir // also copy the clipboard - 99030 - 23.05.2002 - fs@openoffice.org 2395cdf0e10cSrcweir } 2396cdf0e10cSrcweir } 2397cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 2398cdf0e10cSrcweir { 2399cdf0e10cSrcweir } 2400cdf0e10cSrcweir } 2401cdf0e10cSrcweir 2402cdf0e10cSrcweir return aRet; 2403cdf0e10cSrcweir } 2404cdf0e10cSrcweir 2405cdf0e10cSrcweir 2406cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2407cdf0e10cSrcweir 2408cdf0e10cSrcweir TransferableDataHelper TransferableDataHelper::CreateFromSelection( Window* pWindow ) 2409cdf0e10cSrcweir { 2410cdf0e10cSrcweir DBG_ASSERT( pWindow, "Window pointer is NULL" ); 2411cdf0e10cSrcweir 2412cdf0e10cSrcweir Reference< XClipboard > xSelection; 2413cdf0e10cSrcweir TransferableDataHelper aRet; 2414cdf0e10cSrcweir 2415cdf0e10cSrcweir if( pWindow ) 2416cdf0e10cSrcweir xSelection = pWindow->GetPrimarySelection(); 2417cdf0e10cSrcweir 2418cdf0e10cSrcweir if( xSelection.is() ) 2419cdf0e10cSrcweir { 2420cdf0e10cSrcweir const sal_uInt32 nRef = Application::ReleaseSolarMutex(); 2421cdf0e10cSrcweir 2422cdf0e10cSrcweir try 2423cdf0e10cSrcweir { 2424cdf0e10cSrcweir Reference< XTransferable > xTransferable( xSelection->getContents() ); 2425cdf0e10cSrcweir 2426cdf0e10cSrcweir if( xTransferable.is() ) 2427cdf0e10cSrcweir { 2428cdf0e10cSrcweir aRet = TransferableDataHelper( xTransferable ); 2429cdf0e10cSrcweir aRet.mxClipboard = xSelection; 2430cdf0e10cSrcweir } 2431cdf0e10cSrcweir } 2432cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 2433cdf0e10cSrcweir { 2434cdf0e10cSrcweir } 2435cdf0e10cSrcweir 2436cdf0e10cSrcweir Application::AcquireSolarMutex( nRef ); 2437cdf0e10cSrcweir } 2438cdf0e10cSrcweir 2439cdf0e10cSrcweir return aRet; 2440cdf0e10cSrcweir } 2441cdf0e10cSrcweir 2442cdf0e10cSrcweir // ----------------------------------------------------------------------------- 2443cdf0e10cSrcweir sal_Bool TransferableDataHelper::IsEqual( const ::com::sun::star::datatransfer::DataFlavor& rInternalFlavor, 2444cdf0e10cSrcweir const ::com::sun::star::datatransfer::DataFlavor& rRequestFlavor, 2445cdf0e10cSrcweir sal_Bool ) 2446cdf0e10cSrcweir { 2447cdf0e10cSrcweir Reference< XMultiServiceFactory > xFact( ::comphelper::getProcessServiceFactory() ); 2448cdf0e10cSrcweir Reference< XMimeContentTypeFactory > xMimeFact; 2449cdf0e10cSrcweir sal_Bool bRet = sal_False; 2450cdf0e10cSrcweir 2451cdf0e10cSrcweir try 2452cdf0e10cSrcweir { 2453cdf0e10cSrcweir if( xFact.is() ) 2454cdf0e10cSrcweir xMimeFact = Reference< XMimeContentTypeFactory >( xFact->createInstance( ::rtl::OUString::createFromAscii( 2455cdf0e10cSrcweir "com.sun.star.datatransfer.MimeContentTypeFactory" ) ), 2456cdf0e10cSrcweir UNO_QUERY ); 2457cdf0e10cSrcweir 2458cdf0e10cSrcweir if( xMimeFact.is() ) 2459cdf0e10cSrcweir { 2460cdf0e10cSrcweir Reference< XMimeContentType > xRequestType1( xMimeFact->createMimeContentType( rInternalFlavor.MimeType ) ); 2461cdf0e10cSrcweir Reference< XMimeContentType > xRequestType2( xMimeFact->createMimeContentType( rRequestFlavor.MimeType ) ); 2462cdf0e10cSrcweir 2463cdf0e10cSrcweir if( xRequestType1.is() && xRequestType2.is() ) 2464cdf0e10cSrcweir { 2465cdf0e10cSrcweir if( xRequestType1->getFullMediaType().equalsIgnoreAsciiCase( xRequestType2->getFullMediaType() ) ) 2466cdf0e10cSrcweir { 2467cdf0e10cSrcweir if( xRequestType1->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "text/plain" ) ) ) 2468cdf0e10cSrcweir { 2469cdf0e10cSrcweir // special handling for text/plain media types 2470cdf0e10cSrcweir const ::rtl::OUString aCharsetString( ::rtl::OUString::createFromAscii( "charset" ) ); 2471cdf0e10cSrcweir 2472cdf0e10cSrcweir if( !xRequestType2->hasParameter( aCharsetString ) || 2473cdf0e10cSrcweir xRequestType2->getParameterValue( aCharsetString ).equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "utf-16" ) ) || 2474cdf0e10cSrcweir xRequestType2->getParameterValue( aCharsetString ).equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "unicode" ) ) ) 2475cdf0e10cSrcweir { 2476cdf0e10cSrcweir bRet = sal_True; 2477cdf0e10cSrcweir } 2478cdf0e10cSrcweir } 2479cdf0e10cSrcweir else if( xRequestType1->getFullMediaType().equalsIgnoreAsciiCase( ::rtl::OUString::createFromAscii( "application/x-openoffice" ) ) ) 2480cdf0e10cSrcweir { 2481cdf0e10cSrcweir // special handling for application/x-openoffice media types 2482cdf0e10cSrcweir const ::rtl::OUString aFormatString( ::rtl::OUString::createFromAscii( "windows_formatname" ) ); 2483cdf0e10cSrcweir 2484cdf0e10cSrcweir if( xRequestType1->hasParameter( aFormatString ) && 2485cdf0e10cSrcweir xRequestType2->hasParameter( aFormatString ) && 2486cdf0e10cSrcweir xRequestType1->getParameterValue( aFormatString ).equalsIgnoreAsciiCase( xRequestType2->getParameterValue( aFormatString ) ) ) 2487cdf0e10cSrcweir { 2488cdf0e10cSrcweir bRet = sal_True; 2489cdf0e10cSrcweir } 2490cdf0e10cSrcweir } 2491cdf0e10cSrcweir else 2492cdf0e10cSrcweir bRet = sal_True; 2493cdf0e10cSrcweir } 2494cdf0e10cSrcweir } 2495cdf0e10cSrcweir } 2496cdf0e10cSrcweir } 2497cdf0e10cSrcweir catch( const ::com::sun::star::uno::Exception& ) 2498cdf0e10cSrcweir { 2499cdf0e10cSrcweir bRet = rInternalFlavor.MimeType.equalsIgnoreAsciiCase( rRequestFlavor.MimeType ); 2500cdf0e10cSrcweir } 2501cdf0e10cSrcweir 2502cdf0e10cSrcweir return bRet; 2503cdf0e10cSrcweir } 2504