xref: /AOO41X/main/vcl/unx/generic/dtrans/X11_selection.hxx (revision ebfcd9af2ce496a86a62eef7379364d0a42a7f96)
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 #ifndef _DTRANS_X11_SELECTION_HXX_
25 #define _DTRANS_X11_SELECTION_HXX_
26 
27 #include <cppuhelper/compbase3.hxx>
28 #include <cppuhelper/compbase4.hxx>
29 #include <com/sun/star/datatransfer/XTransferable.hpp>
30 #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
31 #include <com/sun/star/datatransfer/dnd/XDragSource.hpp>
32 #include <com/sun/star/awt/XDisplayConnection.hpp>
33 #include <com/sun/star/lang/XInitialization.hpp>
34 #include <com/sun/star/lang/XServiceInfo.hpp>
35 #include <com/sun/star/script/XInvocation.hpp>
36 #include <com/sun/star/frame/XDesktop.hpp>
37 #include <osl/thread.h>
38 
39 #ifndef _OSL_CONDITION_HXX_
40 #include <osl/conditn.hxx>
41 #endif
42 
43 #include <hash_map>
44 #include <list>
45 
46 #include "tools/prex.h"
47 #include <X11/Xlib.h>
48 #include "tools/postx.h"
49 
50 #define XDND_IMPLEMENTATION_NAME "com.sun.star.datatransfer.dnd.XdndSupport"
51 #define XDND_DROPTARGET_IMPLEMENTATION_NAME "com.sun.star.datatransfer.dnd.XdndDropTarget"
52 
53 using namespace ::com::sun::star::uno;
54 
55 namespace x11 {
56 
57     class PixmapHolder; // in bmp.hxx
58 
59 // ------------------------------------------------------------------------
60     rtl_TextEncoding getTextPlainEncoding( const ::rtl::OUString& rMimeType );
61 
62     class SelectionAdaptor
63     {
64     public:
65         virtual com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > getTransferable() = 0;
66         virtual void clearTransferable() = 0;
67         virtual void fireContentsChanged() = 0;
68         virtual com::sun::star::uno::Reference< XInterface > getReference() = 0;
69         // returns a reference that will keep the SelectionAdaptor alive until the
70         // refernce is released
71     };
72 
73     class DropTarget :
74         public ::cppu::WeakComponentImplHelper3<
75             ::com::sun::star::datatransfer::dnd::XDropTarget,
76             ::com::sun::star::lang::XInitialization,
77             ::com::sun::star::lang::XServiceInfo
78         >
79     {
80     public:
81         ::osl::Mutex                m_aMutex;
82         bool                        m_bActive;
83         sal_Int8                    m_nDefaultActions;
84         XLIB_Window                 m_aTargetWindow;
85         class SelectionManager*     m_pSelectionManager;
86         com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSource >
87                                     m_xSelectionManager;
88         ::std::list< com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener > >
89                             m_aListeners;
90 
91         DropTarget();
92         virtual ~DropTarget();
93 
94         // convenience functions that loop over listeners
95         void dragEnter( const ::com::sun::star::datatransfer::dnd::DropTargetDragEnterEvent& dtde ) throw();
96         void dragExit( const ::com::sun::star::datatransfer::dnd::DropTargetEvent& dte ) throw();
97         void dragOver( const ::com::sun::star::datatransfer::dnd::DropTargetDragEvent& dtde ) throw();
98         void drop( const ::com::sun::star::datatransfer::dnd::DropTargetDropEvent& dtde ) throw();
99 
100         // XInitialization
101         virtual void        SAL_CALL initialize( const Sequence< Any >& args ) throw ( ::com::sun::star::uno::Exception );
102 
103         // XDropTarget
104         virtual void        SAL_CALL addDropTargetListener( const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw();
105         virtual void        SAL_CALL removeDropTargetListener( const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDropTargetListener >& ) throw();
106         virtual sal_Bool    SAL_CALL isActive() throw();
107         virtual void        SAL_CALL setActive( sal_Bool active ) throw();
108         virtual sal_Int8    SAL_CALL getDefaultActions() throw();
109         virtual void        SAL_CALL setDefaultActions( sal_Int8 actions ) throw();
110 
111         // XServiceInfo
112         virtual ::rtl::OUString SAL_CALL getImplementationName() throw();
113         virtual sal_Bool    SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw();
114         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString >
115                             SAL_CALL getSupportedServiceNames() throw();
116     };
117 
118     class SelectionManagerHolder :
119         public ::cppu::WeakComponentImplHelper3<
120             ::com::sun::star::datatransfer::dnd::XDragSource,
121             ::com::sun::star::lang::XInitialization,
122             ::com::sun::star::lang::XServiceInfo
123         >
124     {
125         ::osl::Mutex m_aMutex;
126         com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSource >
127             m_xRealDragSource;
128     public:
129         SelectionManagerHolder();
130         virtual ~SelectionManagerHolder();
131 
132         // XServiceInfo
133         virtual ::rtl::OUString SAL_CALL getImplementationName() throw();
134         virtual sal_Bool    SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw();
135         virtual ::com::sun::star::uno::Sequence< ::rtl::OUString >
136                             SAL_CALL getSupportedServiceNames() throw();
137 
138         // XInitialization
139         virtual void        SAL_CALL initialize( const Sequence< Any >& arguments ) throw( ::com::sun::star::uno::Exception );
140 
141         // XDragSource
142         virtual sal_Bool    SAL_CALL isDragImageSupported() throw();
143         virtual sal_Int32   SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw();
144         virtual void        SAL_CALL startDrag(
145             const ::com::sun::star::datatransfer::dnd::DragGestureEvent& trigger,
146             sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image,
147             const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& transferable,
148             const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSourceListener >& listener
149             ) throw();
150 
151     };
152 
153 
154     class SelectionManager :
155         public ::cppu::WeakImplHelper4<
156             ::com::sun::star::datatransfer::dnd::XDragSource,
157             ::com::sun::star::lang::XInitialization,
158             ::com::sun::star::awt::XEventHandler,
159             ::com::sun::star::frame::XTerminateListener
160         >,
161         public SelectionAdaptor
162     {
163         static ::std::hash_map< ::rtl::OUString, SelectionManager*, ::rtl::OUStringHash >& getInstances();
164 
165         // for INCR type selection transfer
166         // INCR protocol is used if the data cannot
167         // be transported at once but in parts
168         // IncrementalTransfer holds the bytes to be transmitted
169         // as well a the current position
170         // INCR triggers the delivery of the next part by deleting the
171         // property used to transfer the data
172         struct IncrementalTransfer
173         {
174             Sequence< sal_Int8 >            m_aData;
175             int                             m_nBufferPos;
176             XLIB_Window                         m_aRequestor;
177             Atom                            m_aProperty;
178             Atom                            m_aTarget;
179             int                             m_nFormat;
180             int                             m_nTransferStartTime;
181         };
182         int m_nIncrementalThreshold;
183 
184         // a struct to hold the data associated with a selection
185         struct Selection
186         {
187             enum State
188             {
189                 Inactive, WaitingForResponse, WaitingForData, IncrementalTransfer
190             };
191 
192             State                       m_eState;
193             SelectionAdaptor*           m_pAdaptor;
194             Atom                        m_aAtom;
195             ::osl::Condition            m_aDataArrived;
196             Sequence< sal_Int8 >        m_aData;
197             Sequence< ::com::sun::star::datatransfer::DataFlavor >
198                                         m_aTypes;
199             std::vector< Atom >         m_aNativeTypes;
200             // this is used for caching
201             // m_aTypes is invalid after 2 seconds
202             // m_aNativeTypes contains the corresponding original atom
203             Atom                        m_aRequestedType;
204             // m_aRequestedType is only valid while WaitingForResponse and WaitingFotData
205             int                         m_nLastTimestamp;
206             bool                        m_bHaveUTF16;
207             Atom                        m_aUTF8Type;
208             bool                        m_bHaveCompound;
209             bool                        m_bOwner;
210             XLIB_Window                 m_aLastOwner;
211             PixmapHolder*               m_pPixmap;
212             // m_nOrigXLIB_Timestamp contains the XLIB_Timestamp at which the seclection
213             // was acquired; needed for XLIB_TimeSTAMP target
214             XLIB_Time                        m_nOrigTimestamp;
215 
Selectionx11::SelectionManager::Selection216             Selection() : m_eState( Inactive ),
217                           m_pAdaptor( NULL ),
218                           m_aAtom( None ),
219                           m_aRequestedType( None ),
220                           m_nLastTimestamp( 0 ),
221                           m_bHaveUTF16( false ),
222                           m_aUTF8Type( None ),
223                           m_bHaveCompound( false ),
224                           m_bOwner( false ),
225                           m_aLastOwner( None ),
226                           m_pPixmap( NULL ),
227                           m_nOrigTimestamp( CurrentTime )
228                 {}
229         };
230 
231         // a struct to hold data associated with a XDropTarget
232         struct DropTargetEntry
233         {
234             DropTarget*     m_pTarget;
235             XLIB_Window     m_aRootWindow;
236 
DropTargetEntryx11::SelectionManager::DropTargetEntry237             DropTargetEntry() : m_pTarget( NULL ), m_aRootWindow( None ) {}
DropTargetEntryx11::SelectionManager::DropTargetEntry238             DropTargetEntry( DropTarget* pTarget ) :
239                     m_pTarget( pTarget ),
240                     m_aRootWindow( None )
241                 {}
DropTargetEntryx11::SelectionManager::DropTargetEntry242             DropTargetEntry( const DropTargetEntry& rEntry ) :
243                     m_pTarget( rEntry.m_pTarget ),
244                     m_aRootWindow( rEntry.m_aRootWindow )
245                 {}
~DropTargetEntryx11::SelectionManager::DropTargetEntry246             ~DropTargetEntry() {}
247 
operator ->x11::SelectionManager::DropTargetEntry248             DropTarget* operator->() const { return m_pTarget; }
operator =x11::SelectionManager::DropTargetEntry249             DropTargetEntry& operator=(const DropTargetEntry& rEntry)
250                 { m_pTarget = rEntry.m_pTarget; m_aRootWindow = rEntry.m_aRootWindow; return *this; }
251         };
252 
253         // internal data
254         Display*                    m_pDisplay;
255         oslThread                   m_aThread;
256         oslThread                   m_aDragExecuteThread;
257         ::osl::Condition            m_aDragRunning;
258         XLIB_Window                 m_aWindow;
259         com::sun::star::uno::Reference< ::com::sun::star::awt::XDisplayConnection >
260                                     m_xDisplayConnection;
261         com::sun::star::uno::Reference< com::sun::star::script::XInvocation >
262                                     m_xBitmapConverter;
263         sal_Int32                   m_nSelectionTimeout;
264         XLIB_Time                   m_nSelectionTimestamp;
265 
266 
267         // members used for Xdnd
268 
269         // drop only
270 
271         // contains the XdndEnterEvent of a drop action running
272         // with one of our targets. The data.l[0] member
273         // (conatining the drag source XLIB_Window) is set
274         // to None while that is not the case
275         XClientMessageEvent         m_aDropEnterEvent;
276         // set to false on XdndEnter
277         // set to true on first XdndPosition or XdndLeave
278         bool                        m_bDropEnterSent;
279         XLIB_Window                 m_aCurrentDropWindow;
280         // XLIB_Time code of XdndDrop
281         XLIB_Time                   m_nDropTime;
282         sal_Int8                    m_nLastDropAction;
283         // XTransferable for Xdnd with foreign drag source
284         com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >
285                                     m_xDropTransferable;
286         int                         m_nLastX, m_nLastY;
287         XLIB_Time                   m_nDropTimestamp;
288         // set to true when calling drop()
289         // if another XdndEnter is received this shows that
290         // someone forgot to call dropComplete - we should reset
291         // and react to the new drop
292         bool                        m_bDropWaitingForCompletion;
293 
294         // drag only
295 
296         // None if no Dnd action is running with us as source
297         XLIB_Window                 m_aDropWindow;
298         // either m_aDropXLIB_Window or its XdndProxy
299         XLIB_Window                 m_aDropProxy;
300         XLIB_Window                 m_aDragSourceWindow;
301         // XTransferable for Xdnd when we are drag source
302         com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >
303                                     m_xDragSourceTransferable;
304         com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSourceListener >
305                                     m_xDragSourceListener;
306         // root coordinates
307         int                         m_nLastDragX, m_nLastDragY;
308         Sequence< ::com::sun::star::datatransfer::DataFlavor >
309                                     m_aDragFlavors;
310         // the rectangle the pointer must leave until a new XdndPosition should
311         // be sent. empty unless the drop target told to fill
312         int                         m_nNoPosX, m_nNoPosY, m_nNoPosWidth, m_nNoPosHeight;
313         unsigned int                m_nDragButton;
314         sal_Int8                    m_nUserDragAction;
315         sal_Int8                    m_nTargetAcceptAction;
316         sal_Int8                    m_nSourceActions;
317         bool                        m_bLastDropAccepted;
318         bool                        m_bDropSuccess;
319         bool                        m_bDropSent;
320         time_t                      m_nDropTimeout;
321         bool                        m_bWaitingForPrimaryConversion;
322         XLIB_Time                   m_nDragTimestamp;
323 
324         // drag cursors
325         XLIB_Cursor                 m_aMoveCursor;
326         XLIB_Cursor                 m_aCopyCursor;
327         XLIB_Cursor                 m_aLinkCursor;
328         XLIB_Cursor                 m_aNoneCursor;
329         XLIB_Cursor                 m_aCurrentCursor;
330 
331 
332         // drag and drop
333 
334         int                         m_nCurrentProtocolVersion;
335         ::std::hash_map< XLIB_Window, DropTargetEntry >
336                                     m_aDropTargets;
337 
338 
339         // some special atoms that are needed often
340         Atom                        m_nCLIPBOARDAtom;
341         Atom                        m_nTARGETSAtom;
342         Atom                        m_nTIMESTAMPAtom;
343         Atom                        m_nTEXTAtom;
344         Atom                        m_nINCRAtom;
345         Atom                        m_nCOMPOUNDAtom;
346         Atom                        m_nMULTIPLEAtom;
347         Atom                        m_nUTF16Atom;
348         Atom                        m_nImageBmpAtom;
349         Atom                        m_nXdndAware;
350         Atom                        m_nXdndEnter;
351         Atom                        m_nXdndLeave;
352         Atom                        m_nXdndPosition;
353         Atom                        m_nXdndStatus;
354         Atom                        m_nXdndDrop;
355         Atom                        m_nXdndFinished;
356         Atom                        m_nXdndSelection;
357         Atom                        m_nXdndTypeList;
358         Atom                        m_nXdndProxy;
359         Atom                        m_nXdndActionCopy;
360         Atom                        m_nXdndActionMove;
361         Atom                        m_nXdndActionLink;
362         Atom                        m_nXdndActionAsk;
363         Atom                        m_nXdndActionPrivate;
364 
365         // caching for atoms
366         ::std::hash_map< Atom, ::rtl::OUString >
367                                     m_aAtomToString;
368         ::std::hash_map< ::rtl::OUString, Atom, ::rtl::OUStringHash >
369                                     m_aStringToAtom;
370 
371         // the registered selections
372         ::std::hash_map< Atom, Selection* >
373                                     m_aSelections;
374         // IncrementalTransfers in progress
375         std::hash_map< XLIB_Window, std::hash_map< Atom, IncrementalTransfer > >
376                                     m_aIncrementals;
377 
378         // do not use X11 multithreading capabilities
379         // since this leads to deadlocks in different Xlib implentations
380         // (XFree as well as Xsun) use an own mutex instead
381         ::osl::Mutex                m_aMutex;
382         bool                        m_bShutDown;
383 
384         SelectionManager();
385         ~SelectionManager();
386 
387         SelectionAdaptor* getAdaptor( Atom selection );
388         PixmapHolder* getPixmapHolder( Atom selection );
389 
390         // handle various events
391         bool handleSelectionRequest( XSelectionRequestEvent& rRequest );
392         bool handleSendPropertyNotify( XPropertyEvent& rNotify );
393         bool handleReceivePropertyNotify( XPropertyEvent& rNotify );
394         bool handleSelectionNotify( XSelectionEvent& rNotify );
395         bool handleDragEvent( XEvent& rMessage );
396         bool handleDropEvent( XClientMessageEvent& rMessage );
397 
398         // dnd helpers
399         void sendDragStatus( Atom nDropAction );
400         void sendDropPosition( bool bForce, XLIB_Time eventXLIB_Time );
401         bool updateDragAction( int modifierState );
402         int getXdndVersion( XLIB_Window aXLIB_Window, XLIB_Window& rProxy );
403         XLIB_Cursor createCursor( const char* pPointerData, const char* pMaskData, int width, int height, int hotX, int hotY );
404         // coordinates on root XLIB_Window
405         void updateDragWindow( int nX, int nY, XLIB_Window aRoot );
406 
407         bool getPasteData( Atom selection, Atom type, Sequence< sal_Int8 >& rData );
408         // returns true if conversion was successful
409         bool convertData( const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& xTransferable,
410                           Atom nType,
411                           Atom nSelection,
412                           int & rFormat,
413                           Sequence< sal_Int8 >& rData );
414         bool sendData( SelectionAdaptor* pAdaptor, XLIB_Window requestor, Atom target, Atom property, Atom selection );
415 
416         // thread dispatch loop
417         public:
418         // public for extern "C" stub
419         static void run( void* );
420         private:
421         void dispatchEvent( int millisec );
422         // drag thread dispatch
423         public:
424         // public for extern "C" stub
425         static void runDragExecute( void* );
426         private:
427         void dragDoDispatch();
428         bool handleXEvent( XEvent& rEvent );
429 
430         // compound text conversion
431         ::rtl::OString convertToCompound( const ::rtl::OUString& rText );
432         ::rtl::OUString convertFromCompound( const char* pText, int nLen = -1 );
433 
434         sal_Int8 getUserDragAction() const;
435         sal_Int32 getSelectionTimeout();
436     public:
437         static SelectionManager& get( const ::rtl::OUString& rDisplayName = ::rtl::OUString() );
438 
getDisplay()439         Display * getDisplay() { return m_pDisplay; };
getWindow()440         XLIB_Window getWindow() { return m_aWindow; };
441 
442 
443         void registerHandler( Atom selection, SelectionAdaptor& rAdaptor );
444         void deregisterHandler( Atom selection );
445         bool requestOwnership( Atom selection );
446 
447         // allow for synchronization over one mutex for XClipboard
getMutex()448         osl::Mutex& getMutex() { return m_aMutex; }
449 
450 
451         Atom getAtom( const ::rtl::OUString& rString );
452         const ::rtl::OUString& getString( Atom nAtom );
453 
454         // type conversion
455         // note: convertTypeToNative does NOT clear the list, so you can append
456         // multiple types to the same list
457         void convertTypeToNative( const ::rtl::OUString& rType, Atom selection, int& rFormat, ::std::list< Atom >& rConversions, bool bPushFront = false );
458         ::rtl::OUString convertTypeFromNative( Atom nType, Atom selection, int& rFormat );
459         void getNativeTypeList( const Sequence< com::sun::star::datatransfer::DataFlavor >& rTypes, std::list< Atom >& rOutTypeList, Atom targetselection );
460 
461         // methods for transferable
462         bool getPasteDataTypes( Atom selection, Sequence< ::com::sun::star::datatransfer::DataFlavor >& rTypes );
463         bool getPasteData( Atom selection, const ::rtl::OUString& rType, Sequence< sal_Int8 >& rData );
464 
465         // for XDropTarget to register/deregister itself
466         void registerDropTarget( XLIB_Window aXLIB_Window, DropTarget* pTarget );
467         void deregisterDropTarget( XLIB_Window aXLIB_Window );
468 
469         // for XDropTarget{Drag|Drop}Context
470         void accept( sal_Int8 dragOperation, XLIB_Window aDropXLIB_Window, XLIB_Time aXLIB_Timestamp );
471         void reject( XLIB_Window aDropXLIB_Window, XLIB_Time aXLIB_Timestamp );
472         void dropComplete( sal_Bool success, XLIB_Window aDropXLIB_Window, XLIB_Time aXLIB_Timestamp );
473 
474         // for XDragSourceContext
475         sal_Int32 getCurrentCursor();
476         void setCursor( sal_Int32 cursor, XLIB_Window aDropXLIB_Window, XLIB_Time aXLIB_Timestamp );
477         void setImage( sal_Int32 image, XLIB_Window aDropXLIB_Window, XLIB_Time aXLIB_Timestamp );
478         void transferablesFlavorsChanged();
479 
480         void shutdown() throw();
481 
482         // XInitialization
483         virtual void        SAL_CALL initialize( const Sequence< Any >& arguments ) throw( ::com::sun::star::uno::Exception );
484 
485         // XEventHandler
486         virtual sal_Bool    SAL_CALL handleEvent( const Any& event ) throw();
487 
488         // XDragSource
489         virtual sal_Bool    SAL_CALL isDragImageSupported() throw();
490         virtual sal_Int32   SAL_CALL getDefaultCursor( sal_Int8 dragAction ) throw();
491         virtual void        SAL_CALL startDrag(
492             const ::com::sun::star::datatransfer::dnd::DragGestureEvent& trigger,
493             sal_Int8 sourceActions, sal_Int32 cursor, sal_Int32 image,
494             const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable >& transferable,
495             const com::sun::star::uno::Reference< ::com::sun::star::datatransfer::dnd::XDragSourceListener >& listener
496             ) throw();
497 
498         // SelectionAdaptor for XdndSelection Drag (we are drag source)
499         virtual com::sun::star::uno::Reference< ::com::sun::star::datatransfer::XTransferable > getTransferable() throw();
500         virtual void clearTransferable() throw();
501         virtual void fireContentsChanged() throw();
502         virtual com::sun::star::uno::Reference< XInterface > getReference() throw();
503 
504         // XEventListener
505         virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw( ::com::sun::star::uno::RuntimeException );
506 
507         // XTerminateListener
508         virtual void SAL_CALL queryTermination( const ::com::sun::star::lang::EventObject& aEvent )
509                 throw( ::com::sun::star::frame::TerminationVetoException, ::com::sun::star::uno::RuntimeException );
510         virtual void SAL_CALL notifyTermination( const ::com::sun::star::lang::EventObject& aEvent )
511                 throw( ::com::sun::star::uno::RuntimeException );
512     };
513 
514 // ------------------------------------------------------------------------
515 
516     ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL Xdnd_getSupportedServiceNames();
517     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Xdnd_createInstance(
518         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & xMultiServiceFactory);
519 
520     ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL Xdnd_dropTarget_getSupportedServiceNames();
521     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Xdnd_dropTarget_createInstance(
522         const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & xMultiServiceFactory);
523 
524 // ------------------------------------------------------------------------
525 
526 }
527 
528 #endif
529