1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_vcl.hxx" 26 27 #include "vos/mutex.hxx" 28 29 #include "osl/mutex.hxx" 30 31 #include "vcl/svapp.hxx" 32 33 #include "svdata.hxx" 34 #include "salinst.hxx" 35 36 #include "com/sun/star/lang/XServiceInfo.hpp" 37 #include "com/sun/star/lang/XSingleServiceFactory.hpp" 38 #include "com/sun/star/lang/XInitialization.hpp" 39 #include "com/sun/star/lang/DisposedException.hpp" 40 #include "com/sun/star/datatransfer/XTransferable.hpp" 41 #include "com/sun/star/datatransfer/clipboard/XClipboard.hpp" 42 #include "com/sun/star/datatransfer/clipboard/XClipboardEx.hpp" 43 #include "com/sun/star/datatransfer/clipboard/XClipboardNotifier.hpp" 44 #include "com/sun/star/datatransfer/clipboard/XClipboardListener.hpp" 45 #include "com/sun/star/datatransfer/dnd/XDragSource.hpp" 46 #include "com/sun/star/datatransfer/dnd/XDropTarget.hpp" 47 #include "com/sun/star/datatransfer/dnd/DNDConstants.hpp" 48 49 #include "cppuhelper/compbase1.hxx" 50 #include "cppuhelper/compbase2.hxx" 51 #include "cppuhelper/compbase3.hxx" 52 #include "cppuhelper/implbase1.hxx" 53 54 using rtl::OUString; 55 using namespace com::sun::star; 56 using namespace com::sun::star::uno; 57 using namespace com::sun::star::lang; 58 59 // ----------------------------------------------------------------------- 60 61 namespace vcl 62 { 63 // generic implementation to satisfy SalInstance 64 class GenericClipboard : 65 public cppu::WeakComponentImplHelper3 < 66 datatransfer::clipboard::XClipboardEx, 67 datatransfer::clipboard::XClipboardNotifier, 68 XServiceInfo 69 > 70 { 71 osl::Mutex m_aMutex; 72 Reference< ::com::sun::star::datatransfer::XTransferable > m_aContents; 73 Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner > m_aOwner; 74 std::list< Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener > > m_aListeners; 75 76 void fireChangedContentsEvent(); 77 void clearContents(); 78 79 public: 80 81 GenericClipboard() : cppu::WeakComponentImplHelper3< 82 datatransfer::clipboard::XClipboardEx, 83 datatransfer::clipboard::XClipboardNotifier, 84 XServiceInfo 85 >( m_aMutex ) 86 {} 87 virtual ~GenericClipboard(); 88 89 /* 90 * XServiceInfo 91 */ 92 93 virtual rtl::OUString SAL_CALL getImplementationName() throw( RuntimeException ); 94 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw( RuntimeException ); 95 virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames() throw( RuntimeException ); 96 97 static rtl::OUString getImplementationName_static(); 98 static Sequence< rtl::OUString > getSupportedServiceNames_static(); 99 100 /* 101 * XClipboard 102 */ 103 104 virtual Reference< ::com::sun::star::datatransfer::XTransferable > SAL_CALL getContents() 105 throw(RuntimeException); 106 107 virtual void SAL_CALL setContents( 108 const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans, 109 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner ) 110 throw(RuntimeException); 111 112 virtual ::rtl::OUString SAL_CALL getName() 113 throw(RuntimeException); 114 115 /* 116 * XClipboardEx 117 */ 118 119 virtual sal_Int8 SAL_CALL getRenderingCapabilities() 120 throw(RuntimeException); 121 122 /* 123 * XClipboardNotifier 124 */ 125 virtual void SAL_CALL addClipboardListener( 126 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener ) 127 throw(RuntimeException); 128 129 virtual void SAL_CALL removeClipboardListener( 130 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener ) 131 throw(RuntimeException); 132 }; 133 134 GenericClipboard::~GenericClipboard() 135 { 136 } 137 138 rtl::OUString GenericClipboard::getImplementationName_static() 139 { 140 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.datatransfer.VCLGenericClipboard" ) ); 141 } 142 143 Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames_static() 144 { 145 Sequence< OUString > aRet(1); 146 aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard"); 147 return aRet; 148 } 149 150 rtl::OUString GenericClipboard::getImplementationName() throw( RuntimeException ) 151 { 152 return getImplementationName_static(); 153 } 154 155 Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames() throw( RuntimeException ) 156 { 157 return getSupportedServiceNames_static(); 158 } 159 160 sal_Bool GenericClipboard::supportsService( const ::rtl::OUString& ServiceName ) throw( RuntimeException ) 161 { 162 Sequence< OUString > aServices( getSupportedServiceNames() ); 163 sal_Int32 nServices = aServices.getLength(); 164 for( sal_Int32 i = 0; i < nServices; i++ ) 165 { 166 if( aServices[i] == ServiceName ) 167 return sal_True; 168 } 169 return sal_False; 170 } 171 172 Reference< ::com::sun::star::datatransfer::XTransferable > GenericClipboard::getContents() throw( RuntimeException ) 173 { 174 return m_aContents; 175 } 176 177 void GenericClipboard::setContents( 178 const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans, 179 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner ) 180 throw( RuntimeException ) 181 { 182 osl::ClearableMutexGuard aGuard( m_aMutex ); 183 Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner ); 184 Reference< datatransfer::XTransferable > xOldContents( m_aContents ); 185 m_aContents = xTrans; 186 m_aOwner = xClipboardOwner; 187 188 std::list< Reference< datatransfer::clipboard::XClipboardListener > > xListeners( m_aListeners ); 189 datatransfer::clipboard::ClipboardEvent aEv; 190 aEv.Contents = m_aContents; 191 192 aGuard.clear(); 193 194 if( xOldOwner.is() && xOldOwner != xClipboardOwner ) 195 xOldOwner->lostOwnership( this, xOldContents ); 196 for( std::list< Reference< datatransfer::clipboard::XClipboardListener > >::iterator it = 197 xListeners.begin(); it != xListeners.end() ; ++it ) 198 { 199 (*it)->changedContents( aEv ); 200 } 201 } 202 203 rtl::OUString GenericClipboard::getName() throw( RuntimeException ) 204 { 205 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CLIPBOARD" ) ); 206 } 207 208 sal_Int8 GenericClipboard::getRenderingCapabilities() throw( RuntimeException ) 209 { 210 return 0; 211 } 212 213 void GenericClipboard::addClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener ) 214 throw( RuntimeException ) 215 { 216 osl::ClearableMutexGuard aGuard( m_aMutex ); 217 218 m_aListeners.push_back( listener ); 219 } 220 221 void GenericClipboard::removeClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener ) 222 throw( RuntimeException ) 223 { 224 osl::ClearableMutexGuard aGuard( m_aMutex ); 225 226 m_aListeners.remove( listener ); 227 } 228 229 // ------------------------------------------------------------------------ 230 231 class ClipboardFactory : public ::cppu::WeakComponentImplHelper1< 232 com::sun::star::lang::XSingleServiceFactory 233 > 234 { 235 osl::Mutex m_aMutex; 236 public: 237 ClipboardFactory(); 238 virtual ~ClipboardFactory(); 239 240 /* 241 * XSingleServiceFactory 242 */ 243 virtual Reference< XInterface > SAL_CALL createInstance() throw(); 244 virtual Reference< XInterface > SAL_CALL createInstanceWithArguments( const Sequence< Any >& rArgs ) throw(); 245 }; 246 247 // ------------------------------------------------------------------------ 248 249 ClipboardFactory::ClipboardFactory() : 250 cppu::WeakComponentImplHelper1< 251 com::sun::star::lang::XSingleServiceFactory 252 >( m_aMutex ) 253 { 254 } 255 256 // ------------------------------------------------------------------------ 257 258 ClipboardFactory::~ClipboardFactory() 259 { 260 } 261 262 // ------------------------------------------------------------------------ 263 264 Reference< XInterface > ClipboardFactory::createInstance() throw() 265 { 266 return createInstanceWithArguments( Sequence< Any >() ); 267 } 268 269 // ------------------------------------------------------------------------ 270 271 Reference< XInterface > ClipboardFactory::createInstanceWithArguments( const Sequence< Any >& arguments ) throw() 272 { 273 vos::OGuard aGuard( Application::GetSolarMutex() ); 274 Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateClipboard( arguments ); 275 return xResult; 276 } 277 278 // ------------------------------------------------------------------------ 279 280 Sequence< OUString > SAL_CALL Clipboard_getSupportedServiceNames() 281 { 282 Sequence< OUString > aRet(1); 283 aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard"); 284 return aRet; 285 } 286 287 OUString SAL_CALL Clipboard_getImplementationName() 288 { 289 #if defined UNX 290 return OUString( RTL_CONSTASCII_USTRINGPARAM( 291 #if ! defined QUARTZ 292 "com.sun.star.datatransfer.X11ClipboardSupport" 293 #else 294 "com.sun.star.datatransfer.clipboard.AquaClipboard" 295 #endif 296 ) ); 297 #else 298 return GenericClipboard::getImplementationName_static(); 299 #endif 300 } 301 302 Reference< XSingleServiceFactory > SAL_CALL Clipboard_createFactory( const Reference< XMultiServiceFactory > & ) 303 { 304 return Reference< XSingleServiceFactory >( new ClipboardFactory() ); 305 } 306 307 /* 308 * generic DragSource dummy 309 */ 310 class GenericDragSource : public cppu::WeakComponentImplHelper2< 311 datatransfer::dnd::XDragSource, 312 XInitialization 313 > 314 { 315 osl::Mutex m_aMutex; 316 public: 317 GenericDragSource() : cppu::WeakComponentImplHelper2< datatransfer::dnd::XDragSource, XInitialization >( m_aMutex ) {} 318 virtual ~GenericDragSource(); 319 320 // XDragSource 321 virtual sal_Bool SAL_CALL isDragImageSupported() throw(); 322 virtual sal_Int32 SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw(); 323 virtual void SAL_CALL startDrag( 324 const datatransfer::dnd::DragGestureEvent& trigger, 325 sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image, 326 const Reference< datatransfer::XTransferable >& transferable, 327 const Reference< datatransfer::dnd::XDragSourceListener >& listener 328 ) throw(); 329 330 // XInitialization 331 virtual void SAL_CALL initialize( const Sequence< Any >& arguments ) throw( ::com::sun::star::uno::Exception ); 332 333 static Sequence< OUString > getSupportedServiceNames_static() 334 { 335 Sequence< OUString > aRet( 1 ); 336 aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDragSource" ); 337 return aRet; 338 } 339 340 static OUString getImplementationName_static() 341 { 342 return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDragSource" ); 343 } 344 }; 345 346 GenericDragSource::~GenericDragSource() 347 { 348 } 349 350 sal_Bool GenericDragSource::isDragImageSupported() throw() 351 { 352 return sal_False; 353 } 354 355 sal_Int32 GenericDragSource::getDefaultCursor( sal_Int8 ) throw() 356 { 357 return 0; 358 } 359 360 void GenericDragSource::startDrag( const datatransfer::dnd::DragGestureEvent&, 361 sal_Int8 /*sourceActions*/, sal_Int32 /*cursor*/, sal_Int32 /*image*/, 362 const Reference< datatransfer::XTransferable >&, 363 const Reference< datatransfer::dnd::XDragSourceListener >& listener 364 ) throw() 365 { 366 datatransfer::dnd::DragSourceDropEvent aEv; 367 aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_COPY; 368 aEv.DropSuccess = sal_False; 369 listener->dragDropEnd( aEv ); 370 } 371 372 void GenericDragSource::initialize( const Sequence< Any >& ) throw( Exception ) 373 { 374 } 375 376 377 Sequence< OUString > SAL_CALL DragSource_getSupportedServiceNames() 378 { 379 #if defined UNX 380 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( 381 #if ! defined QUARTZ 382 "com.sun.star.datatransfer.dnd.X11DragSource" 383 #else 384 "com.sun.star.datatransfer.dnd.OleDragSource" 385 #endif 386 ) ); 387 static Sequence< OUString > aServiceNames( &aServiceName, 1 ); 388 return aServiceNames; 389 #else 390 return GenericDragSource::getSupportedServiceNames_static(); 391 #endif 392 } 393 394 OUString SAL_CALL DragSource_getImplementationName() 395 { 396 #if defined UNX 397 return OUString( RTL_CONSTASCII_USTRINGPARAM( 398 #if ! defined QUARTZ 399 "com.sun.star.datatransfer.dnd.XdndSupport" 400 #else 401 "com.sun.star.comp.datatransfer.dnd.OleDragSource_V1" 402 #endif 403 ) ); 404 #else 405 return GenericDragSource::getImplementationName_static(); 406 #endif 407 } 408 409 Reference< XInterface > SAL_CALL DragSource_createInstance( const Reference< XMultiServiceFactory >& ) 410 { 411 vos::OGuard aGuard( Application::GetSolarMutex() ); 412 Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDragSource(); 413 return xResult; 414 } 415 416 /* 417 * generic DragSource dummy 418 */ 419 420 class GenericDropTarget : public cppu::WeakComponentImplHelper2< 421 datatransfer::dnd::XDropTarget, 422 XInitialization 423 > 424 { 425 osl::Mutex m_aMutex; 426 public: 427 GenericDropTarget() : cppu::WeakComponentImplHelper2< 428 datatransfer::dnd::XDropTarget, 429 XInitialization 430 > ( m_aMutex ) 431 {} 432 virtual ~GenericDropTarget(); 433 434 // XInitialization 435 virtual void SAL_CALL initialize( const Sequence< Any >& args ) throw ( Exception ); 436 437 // XDropTarget 438 virtual void SAL_CALL addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw(); 439 virtual void SAL_CALL removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw(); 440 virtual sal_Bool SAL_CALL isActive() throw(); 441 virtual void SAL_CALL setActive( sal_Bool active ) throw(); 442 virtual sal_Int8 SAL_CALL getDefaultActions() throw(); 443 virtual void SAL_CALL setDefaultActions( sal_Int8 actions ) throw(); 444 445 static Sequence< OUString > getSupportedServiceNames_static() 446 { 447 Sequence< OUString > aRet( 1 ); 448 aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDropTarget" ); 449 return aRet; 450 } 451 452 static OUString getImplementationName_static() 453 { 454 return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDropTarget" ); 455 } 456 }; 457 458 GenericDropTarget::~GenericDropTarget() 459 { 460 } 461 462 void GenericDropTarget::initialize( const Sequence< Any >& ) throw( Exception ) 463 { 464 } 465 466 void GenericDropTarget::addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw() 467 { 468 } 469 470 void GenericDropTarget::removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw() 471 { 472 } 473 474 sal_Bool GenericDropTarget::isActive() throw() 475 { 476 return sal_False; 477 } 478 479 void GenericDropTarget::setActive( sal_Bool ) throw() 480 { 481 } 482 483 sal_Int8 GenericDropTarget::getDefaultActions() throw() 484 { 485 return 0; 486 } 487 488 void GenericDropTarget::setDefaultActions( sal_Int8) throw() 489 { 490 } 491 492 Sequence< OUString > SAL_CALL DropTarget_getSupportedServiceNames() 493 { 494 #if defined UNX 495 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM( 496 #if ! defined QUARTZ 497 "com.sun.star.datatransfer.dnd.X11DropTarget" 498 #else 499 "com.sun.star.datatransfer.dnd.OleDropTarget" 500 #endif 501 ) ); 502 static Sequence< OUString > aServiceNames( &aServiceName, 1 ); 503 return aServiceNames; 504 #else 505 return GenericDropTarget::getSupportedServiceNames_static(); 506 #endif 507 } 508 509 OUString SAL_CALL DropTarget_getImplementationName() 510 { 511 #if defined UNX 512 return OUString( RTL_CONSTASCII_USTRINGPARAM( 513 #if ! defined QUARTZ 514 "com.sun.star.datatransfer.dnd.XdndDropTarget" 515 #else 516 "com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1" 517 #endif 518 ) ); 519 #else 520 return GenericDropTarget::getImplementationName_static(); 521 #endif 522 } 523 524 Reference< XInterface > SAL_CALL DropTarget_createInstance( const Reference< XMultiServiceFactory >& ) 525 { 526 vos::OGuard aGuard( Application::GetSolarMutex() ); 527 Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDropTarget(); 528 return xResult; 529 } 530 531 532 } // namespace vcl 533 534 /* 535 * SalInstance generic 536 */ 537 Reference< XInterface > SalInstance::CreateClipboard( const Sequence< Any >& ) 538 { 539 return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericClipboard() ); 540 } 541 542 Reference< XInterface > SalInstance::CreateDragSource() 543 { 544 return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDragSource() ); 545 } 546 547 Reference< XInterface > SalInstance::CreateDropTarget() 548 { 549 return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDropTarget() ); 550 } 551 552