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
GenericClipboard()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();
94 virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName );
95 virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames();
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
106 virtual void SAL_CALL setContents(
107 const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans,
108 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner );
109
110 virtual ::rtl::OUString SAL_CALL getName();
111
112 /*
113 * XClipboardEx
114 */
115
116 virtual sal_Int8 SAL_CALL getRenderingCapabilities();
117
118 /*
119 * XClipboardNotifier
120 */
121 virtual void SAL_CALL addClipboardListener(
122 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener );
123
124 virtual void SAL_CALL removeClipboardListener(
125 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardListener >& listener );
126 };
127
~GenericClipboard()128 GenericClipboard::~GenericClipboard()
129 {
130 }
131
getImplementationName_static()132 rtl::OUString GenericClipboard::getImplementationName_static()
133 {
134 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.datatransfer.VCLGenericClipboard" ) );
135 }
136
getSupportedServiceNames_static()137 Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames_static()
138 {
139 Sequence< OUString > aRet(1);
140 aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard");
141 return aRet;
142 }
143
getImplementationName()144 rtl::OUString GenericClipboard::getImplementationName()
145 {
146 return getImplementationName_static();
147 }
148
getSupportedServiceNames()149 Sequence< rtl::OUString > GenericClipboard::getSupportedServiceNames()
150 {
151 return getSupportedServiceNames_static();
152 }
153
supportsService(const::rtl::OUString & ServiceName)154 sal_Bool GenericClipboard::supportsService( const ::rtl::OUString& ServiceName )
155 {
156 Sequence< OUString > aServices( getSupportedServiceNames() );
157 sal_Int32 nServices = aServices.getLength();
158 for( sal_Int32 i = 0; i < nServices; i++ )
159 {
160 if( aServices[i] == ServiceName )
161 return sal_True;
162 }
163 return sal_False;
164 }
165
getContents()166 Reference< ::com::sun::star::datatransfer::XTransferable > GenericClipboard::getContents()
167 {
168 return m_aContents;
169 }
170
setContents(const Reference<::com::sun::star::datatransfer::XTransferable> & xTrans,const Reference<::com::sun::star::datatransfer::clipboard::XClipboardOwner> & xClipboardOwner)171 void GenericClipboard::setContents(
172 const Reference< ::com::sun::star::datatransfer::XTransferable >& xTrans,
173 const Reference< ::com::sun::star::datatransfer::clipboard::XClipboardOwner >& xClipboardOwner )
174 {
175 osl::ClearableMutexGuard aGuard( m_aMutex );
176 Reference< datatransfer::clipboard::XClipboardOwner > xOldOwner( m_aOwner );
177 Reference< datatransfer::XTransferable > xOldContents( m_aContents );
178 m_aContents = xTrans;
179 m_aOwner = xClipboardOwner;
180
181 std::list< Reference< datatransfer::clipboard::XClipboardListener > > xListeners( m_aListeners );
182 datatransfer::clipboard::ClipboardEvent aEv;
183 aEv.Contents = m_aContents;
184
185 aGuard.clear();
186
187 if( xOldOwner.is() && xOldOwner != xClipboardOwner )
188 xOldOwner->lostOwnership( this, xOldContents );
189 for( std::list< Reference< datatransfer::clipboard::XClipboardListener > >::iterator it =
190 xListeners.begin(); it != xListeners.end() ; ++it )
191 {
192 (*it)->changedContents( aEv );
193 }
194 }
195
getName()196 rtl::OUString GenericClipboard::getName()
197 {
198 return rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "CLIPBOARD" ) );
199 }
200
getRenderingCapabilities()201 sal_Int8 GenericClipboard::getRenderingCapabilities()
202 {
203 return 0;
204 }
205
addClipboardListener(const Reference<datatransfer::clipboard::XClipboardListener> & listener)206 void GenericClipboard::addClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener )
207 {
208 osl::ClearableMutexGuard aGuard( m_aMutex );
209
210 m_aListeners.push_back( listener );
211 }
212
removeClipboardListener(const Reference<datatransfer::clipboard::XClipboardListener> & listener)213 void GenericClipboard::removeClipboardListener( const Reference< datatransfer::clipboard::XClipboardListener >& listener )
214 {
215 osl::ClearableMutexGuard aGuard( m_aMutex );
216
217 m_aListeners.remove( listener );
218 }
219
220 // ------------------------------------------------------------------------
221
222 class ClipboardFactory : public ::cppu::WeakComponentImplHelper1<
223 com::sun::star::lang::XSingleServiceFactory
224 >
225 {
226 osl::Mutex m_aMutex;
227 public:
228 ClipboardFactory();
229 virtual ~ClipboardFactory();
230
231 /*
232 * XSingleServiceFactory
233 */
234 virtual Reference< XInterface > SAL_CALL createInstance() throw();
235 virtual Reference< XInterface > SAL_CALL createInstanceWithArguments( const Sequence< Any >& rArgs ) throw();
236 };
237
238 // ------------------------------------------------------------------------
239
ClipboardFactory()240 ClipboardFactory::ClipboardFactory() :
241 cppu::WeakComponentImplHelper1<
242 com::sun::star::lang::XSingleServiceFactory
243 >( m_aMutex )
244 {
245 }
246
247 // ------------------------------------------------------------------------
248
~ClipboardFactory()249 ClipboardFactory::~ClipboardFactory()
250 {
251 }
252
253 // ------------------------------------------------------------------------
254
createInstance()255 Reference< XInterface > ClipboardFactory::createInstance() throw()
256 {
257 return createInstanceWithArguments( Sequence< Any >() );
258 }
259
260 // ------------------------------------------------------------------------
261
createInstanceWithArguments(const Sequence<Any> & arguments)262 Reference< XInterface > ClipboardFactory::createInstanceWithArguments( const Sequence< Any >& arguments ) throw()
263 {
264 vos::OGuard aGuard( Application::GetSolarMutex() );
265 Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateClipboard( arguments );
266 return xResult;
267 }
268
269 // ------------------------------------------------------------------------
270
Clipboard_getSupportedServiceNames()271 Sequence< OUString > SAL_CALL Clipboard_getSupportedServiceNames()
272 {
273 Sequence< OUString > aRet(1);
274 aRet[0] = OUString::createFromAscii("com.sun.star.datatransfer.clipboard.SystemClipboard");
275 return aRet;
276 }
277
Clipboard_getImplementationName()278 OUString SAL_CALL Clipboard_getImplementationName()
279 {
280 #if defined UNX
281 return OUString( RTL_CONSTASCII_USTRINGPARAM(
282 #if ! defined QUARTZ
283 "com.sun.star.datatransfer.X11ClipboardSupport"
284 #else
285 "com.sun.star.datatransfer.clipboard.AquaClipboard"
286 #endif
287 ) );
288 #else
289 return GenericClipboard::getImplementationName_static();
290 #endif
291 }
292
Clipboard_createFactory(const Reference<XMultiServiceFactory> &)293 Reference< XSingleServiceFactory > SAL_CALL Clipboard_createFactory( const Reference< XMultiServiceFactory > & )
294 {
295 return Reference< XSingleServiceFactory >( new ClipboardFactory() );
296 }
297
298 /*
299 * generic DragSource dummy
300 */
301 class GenericDragSource : public cppu::WeakComponentImplHelper2<
302 datatransfer::dnd::XDragSource,
303 XInitialization
304 >
305 {
306 osl::Mutex m_aMutex;
307 public:
GenericDragSource()308 GenericDragSource() : cppu::WeakComponentImplHelper2< datatransfer::dnd::XDragSource, XInitialization >( m_aMutex ) {}
309 virtual ~GenericDragSource();
310
311 // XDragSource
312 virtual sal_Bool SAL_CALL isDragImageSupported() throw();
313 virtual sal_Int32 SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw();
314 virtual void SAL_CALL startDrag(
315 const datatransfer::dnd::DragGestureEvent& trigger,
316 sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image,
317 const Reference< datatransfer::XTransferable >& transferable,
318 const Reference< datatransfer::dnd::XDragSourceListener >& listener
319 ) throw();
320
321 // XInitialization
322 virtual void SAL_CALL initialize( const Sequence< Any >& arguments );
323
getSupportedServiceNames_static()324 static Sequence< OUString > getSupportedServiceNames_static()
325 {
326 Sequence< OUString > aRet( 1 );
327 aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDragSource" );
328 return aRet;
329 }
330
getImplementationName_static()331 static OUString getImplementationName_static()
332 {
333 return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDragSource" );
334 }
335 };
336
~GenericDragSource()337 GenericDragSource::~GenericDragSource()
338 {
339 }
340
isDragImageSupported()341 sal_Bool GenericDragSource::isDragImageSupported() throw()
342 {
343 return sal_False;
344 }
345
getDefaultCursor(sal_Int8)346 sal_Int32 GenericDragSource::getDefaultCursor( sal_Int8 ) throw()
347 {
348 return 0;
349 }
350
startDrag(const datatransfer::dnd::DragGestureEvent &,sal_Int8,sal_Int32,sal_Int32,const Reference<datatransfer::XTransferable> &,const Reference<datatransfer::dnd::XDragSourceListener> & listener)351 void GenericDragSource::startDrag( const datatransfer::dnd::DragGestureEvent&,
352 sal_Int8 /*sourceActions*/, sal_Int32 /*cursor*/, sal_Int32 /*image*/,
353 const Reference< datatransfer::XTransferable >&,
354 const Reference< datatransfer::dnd::XDragSourceListener >& listener
355 ) throw()
356 {
357 datatransfer::dnd::DragSourceDropEvent aEv;
358 aEv.DropAction = datatransfer::dnd::DNDConstants::ACTION_COPY;
359 aEv.DropSuccess = sal_False;
360 listener->dragDropEnd( aEv );
361 }
362
initialize(const Sequence<Any> &)363 void GenericDragSource::initialize( const Sequence< Any >& )
364 {
365 }
366
367
DragSource_getSupportedServiceNames()368 Sequence< OUString > SAL_CALL DragSource_getSupportedServiceNames()
369 {
370 #if defined UNX
371 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM(
372 #if ! defined QUARTZ
373 "com.sun.star.datatransfer.dnd.X11DragSource"
374 #else
375 "com.sun.star.datatransfer.dnd.OleDragSource"
376 #endif
377 ) );
378 static Sequence< OUString > aServiceNames( &aServiceName, 1 );
379 return aServiceNames;
380 #else
381 return GenericDragSource::getSupportedServiceNames_static();
382 #endif
383 }
384
DragSource_getImplementationName()385 OUString SAL_CALL DragSource_getImplementationName()
386 {
387 #if defined UNX
388 return OUString( RTL_CONSTASCII_USTRINGPARAM(
389 #if ! defined QUARTZ
390 "com.sun.star.datatransfer.dnd.XdndSupport"
391 #else
392 "com.sun.star.comp.datatransfer.dnd.OleDragSource_V1"
393 #endif
394 ) );
395 #else
396 return GenericDragSource::getImplementationName_static();
397 #endif
398 }
399
DragSource_createInstance(const Reference<XMultiServiceFactory> &)400 Reference< XInterface > SAL_CALL DragSource_createInstance( const Reference< XMultiServiceFactory >& )
401 {
402 vos::OGuard aGuard( Application::GetSolarMutex() );
403 Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDragSource();
404 return xResult;
405 }
406
407 /*
408 * generic DragSource dummy
409 */
410
411 class GenericDropTarget : public cppu::WeakComponentImplHelper2<
412 datatransfer::dnd::XDropTarget,
413 XInitialization
414 >
415 {
416 osl::Mutex m_aMutex;
417 public:
GenericDropTarget()418 GenericDropTarget() : cppu::WeakComponentImplHelper2<
419 datatransfer::dnd::XDropTarget,
420 XInitialization
421 > ( m_aMutex )
422 {}
423 virtual ~GenericDropTarget();
424
425 // XInitialization
426 virtual void SAL_CALL initialize( const Sequence< Any >& args );
427
428 // XDropTarget
429 virtual void SAL_CALL addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw();
430 virtual void SAL_CALL removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw();
431 virtual sal_Bool SAL_CALL isActive() throw();
432 virtual void SAL_CALL setActive( sal_Bool active ) throw();
433 virtual sal_Int8 SAL_CALL getDefaultActions() throw();
434 virtual void SAL_CALL setDefaultActions( sal_Int8 actions ) throw();
435
getSupportedServiceNames_static()436 static Sequence< OUString > getSupportedServiceNames_static()
437 {
438 Sequence< OUString > aRet( 1 );
439 aRet[0] = OUString::createFromAscii( "com.sun.star.datatransfer.dnd.GenericDropTarget" );
440 return aRet;
441 }
442
getImplementationName_static()443 static OUString getImplementationName_static()
444 {
445 return OUString::createFromAscii( "com.sun.star.datatransfer.dnd.VclGenericDropTarget" );
446 }
447 };
448
~GenericDropTarget()449 GenericDropTarget::~GenericDropTarget()
450 {
451 }
452
initialize(const Sequence<Any> &)453 void GenericDropTarget::initialize( const Sequence< Any >& )
454 {
455 }
456
addDropTargetListener(const Reference<::com::sun::star::datatransfer::dnd::XDropTargetListener> &)457 void GenericDropTarget::addDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw()
458 {
459 }
460
removeDropTargetListener(const Reference<::com::sun::star::datatransfer::dnd::XDropTargetListener> &)461 void GenericDropTarget::removeDropTargetListener( const Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw()
462 {
463 }
464
isActive()465 sal_Bool GenericDropTarget::isActive() throw()
466 {
467 return sal_False;
468 }
469
setActive(sal_Bool)470 void GenericDropTarget::setActive( sal_Bool ) throw()
471 {
472 }
473
getDefaultActions()474 sal_Int8 GenericDropTarget::getDefaultActions() throw()
475 {
476 return 0;
477 }
478
setDefaultActions(sal_Int8)479 void GenericDropTarget::setDefaultActions( sal_Int8) throw()
480 {
481 }
482
DropTarget_getSupportedServiceNames()483 Sequence< OUString > SAL_CALL DropTarget_getSupportedServiceNames()
484 {
485 #if defined UNX
486 static OUString aServiceName( RTL_CONSTASCII_USTRINGPARAM(
487 #if ! defined QUARTZ
488 "com.sun.star.datatransfer.dnd.X11DropTarget"
489 #else
490 "com.sun.star.datatransfer.dnd.OleDropTarget"
491 #endif
492 ) );
493 static Sequence< OUString > aServiceNames( &aServiceName, 1 );
494 return aServiceNames;
495 #else
496 return GenericDropTarget::getSupportedServiceNames_static();
497 #endif
498 }
499
DropTarget_getImplementationName()500 OUString SAL_CALL DropTarget_getImplementationName()
501 {
502 #if defined UNX
503 return OUString( RTL_CONSTASCII_USTRINGPARAM(
504 #if ! defined QUARTZ
505 "com.sun.star.datatransfer.dnd.XdndDropTarget"
506 #else
507 "com.sun.star.comp.datatransfer.dnd.OleDropTarget_V1"
508 #endif
509 ) );
510 #else
511 return GenericDropTarget::getImplementationName_static();
512 #endif
513 }
514
DropTarget_createInstance(const Reference<XMultiServiceFactory> &)515 Reference< XInterface > SAL_CALL DropTarget_createInstance( const Reference< XMultiServiceFactory >& )
516 {
517 vos::OGuard aGuard( Application::GetSolarMutex() );
518 Reference< XInterface > xResult = ImplGetSVData()->mpDefInst->CreateDropTarget();
519 return xResult;
520 }
521
522
523 } // namespace vcl
524
525 /*
526 * SalInstance generic
527 */
CreateClipboard(const Sequence<Any> &)528 Reference< XInterface > SalInstance::CreateClipboard( const Sequence< Any >& )
529 {
530 return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericClipboard() );
531 }
532
CreateDragSource()533 Reference< XInterface > SalInstance::CreateDragSource()
534 {
535 return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDragSource() );
536 }
537
CreateDropTarget()538 Reference< XInterface > SalInstance::CreateDropTarget()
539 {
540 return Reference< XInterface >( ( cppu::OWeakObject * )new vcl::GenericDropTarget() );
541 }
542