xref: /aoo42x/main/dtrans/source/os2/dnd/DragSource.cxx (revision cc13e73e)
1*cc13e73eSYuri Dario /**************************************************************
2*cc13e73eSYuri Dario *
3*cc13e73eSYuri Dario * Licensed to the Apache Software Foundation (ASF) under one
4*cc13e73eSYuri Dario * or more contributor license agreements.  See the NOTICE file
5*cc13e73eSYuri Dario * distributed with this work for additional information
6*cc13e73eSYuri Dario * regarding copyright ownership.  The ASF licenses this file
7*cc13e73eSYuri Dario * to you under the Apache License, Version 2.0 (the
8*cc13e73eSYuri Dario * "License"); you may not use this file except in compliance
9*cc13e73eSYuri Dario * with the License.  You may obtain a copy of the License at
10*cc13e73eSYuri Dario *
11*cc13e73eSYuri Dario *   http://www.apache.org/licenses/LICENSE-2.0
12*cc13e73eSYuri Dario *
13*cc13e73eSYuri Dario * Unless required by applicable law or agreed to in writing,
14*cc13e73eSYuri Dario * software distributed under the License is distributed on an
15*cc13e73eSYuri Dario * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*cc13e73eSYuri Dario * KIND, either express or implied.  See the License for the
17*cc13e73eSYuri Dario * specific language governing permissions and limitations
18*cc13e73eSYuri Dario * under the License.
19*cc13e73eSYuri Dario *
20*cc13e73eSYuri Dario *************************************************************/
21*cc13e73eSYuri Dario 
22*cc13e73eSYuri Dario 
23*cc13e73eSYuri Dario // MARKER(update_precomp.py): autogen include statement, do not remove
24*cc13e73eSYuri Dario #include "precompiled_dtrans.hxx"
25*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>
26*cc13e73eSYuri Dario #include <com/sun/star/datatransfer/XTransferable.hpp>
27*cc13e73eSYuri Dario #include <com/sun/star/awt/MouseButton.hpp>
28*cc13e73eSYuri Dario #include <com/sun/star/awt/MouseEvent.hpp>
29*cc13e73eSYuri Dario 
30*cc13e73eSYuri Dario #include <vcl/window.hxx>
31*cc13e73eSYuri Dario 
32*cc13e73eSYuri Dario #include "DragSource.hxx"
33*cc13e73eSYuri Dario #include "globals.hxx"
34*cc13e73eSYuri Dario 
35*cc13e73eSYuri Dario using namespace com::sun::star::datatransfer::dnd::DNDConstants;
36*cc13e73eSYuri Dario 
37*cc13e73eSYuri Dario // for AOO internal D&D we provide the Transferable
38*cc13e73eSYuri Dario Reference<XTransferable> DragSource::g_XTransferable;
39*cc13e73eSYuri Dario // the handle of the window starting the drag
40*cc13e73eSYuri Dario HWND DragSource::g_DragSourceHwnd = NULLHANDLE;
41*cc13e73eSYuri Dario 
42*cc13e73eSYuri Dario 
DragSource(const Reference<XMultiServiceFactory> & sf)43*cc13e73eSYuri Dario DragSource::DragSource( const Reference<XMultiServiceFactory>& sf):
44*cc13e73eSYuri Dario     WeakComponentImplHelper4< XDragSource,
45*cc13e73eSYuri Dario             XInitialization,
46*cc13e73eSYuri Dario             XDragSourceContext,
47*cc13e73eSYuri Dario             XServiceInfo >(m_aMutex),
48*cc13e73eSYuri Dario     m_serviceFactory(sf),
49*cc13e73eSYuri Dario     pSourceDraginfo(NULL),
50*cc13e73eSYuri Dario     pSharedMem(NULL),
51*cc13e73eSYuri Dario     pDTShareMem(NULL)
52*cc13e73eSYuri Dario {
53*cc13e73eSYuri Dario     g_moduleCount.modCnt.acquire( &g_moduleCount.modCnt);
54*cc13e73eSYuri Dario     debug_printf("DragSource::DragSource");
55*cc13e73eSYuri Dario }
56*cc13e73eSYuri Dario 
~DragSource()57*cc13e73eSYuri Dario DragSource::~DragSource()
58*cc13e73eSYuri Dario {
59*cc13e73eSYuri Dario     g_moduleCount.modCnt.release( &g_moduleCount.modCnt);
60*cc13e73eSYuri Dario     debug_printf("DragSource::~DragSource");
61*cc13e73eSYuri Dario }
62*cc13e73eSYuri Dario 
63*cc13e73eSYuri Dario // XInitialization
64*cc13e73eSYuri Dario 
65*cc13e73eSYuri Dario //
66*cc13e73eSYuri Dario // aArguments contains a machine id
67*cc13e73eSYuri Dario //
initialize(const Sequence<Any> & aArguments)68*cc13e73eSYuri Dario void SAL_CALL DragSource::initialize( const Sequence< Any >& aArguments )
69*cc13e73eSYuri Dario throw(Exception, RuntimeException)
70*cc13e73eSYuri Dario {
71*cc13e73eSYuri Dario     if (aArguments.getLength() < 2) {
72*cc13e73eSYuri Dario         throw Exception(OUString(RTL_CONSTASCII_USTRINGPARAM("DragSource::initialize: Not enough parameter.")),
73*cc13e73eSYuri Dario                         static_cast<OWeakObject*>(this));
74*cc13e73eSYuri Dario     }
75*cc13e73eSYuri Dario 
76*cc13e73eSYuri Dario     m_hWnd = *(HWND*)aArguments[1].getValue();
77*cc13e73eSYuri Dario     debug_printf("DragSource::initialize hwnd %x", m_hWnd);
78*cc13e73eSYuri Dario     // init done in DropTarget, window is already subclassed
79*cc13e73eSYuri Dario     SetWindowDragSourcePtr( m_hWnd, this);
80*cc13e73eSYuri Dario }
81*cc13e73eSYuri Dario 
disposing()82*cc13e73eSYuri Dario void SAL_CALL DragSource::disposing()
83*cc13e73eSYuri Dario {
84*cc13e73eSYuri Dario     debug_printf("DragSource::disposing hwnd %x", m_hWnd);
85*cc13e73eSYuri Dario     SetWindowDragSourcePtr( m_hWnd, 0);
86*cc13e73eSYuri Dario }
87*cc13e73eSYuri Dario 
88*cc13e73eSYuri Dario // XDragSource
isDragImageSupported()89*cc13e73eSYuri Dario sal_Bool SAL_CALL DragSource::isDragImageSupported(  )
90*cc13e73eSYuri Dario throw(RuntimeException)
91*cc13e73eSYuri Dario {
92*cc13e73eSYuri Dario     return 0;
93*cc13e73eSYuri Dario }
94*cc13e73eSYuri Dario 
getDefaultCursor(sal_Int8)95*cc13e73eSYuri Dario sal_Int32 SAL_CALL DragSource::getDefaultCursor( sal_Int8 /*dragAction*/ )
96*cc13e73eSYuri Dario throw( IllegalArgumentException, RuntimeException)
97*cc13e73eSYuri Dario {
98*cc13e73eSYuri Dario     return 0;
99*cc13e73eSYuri Dario }
100*cc13e73eSYuri Dario 
101*cc13e73eSYuri Dario //
102*cc13e73eSYuri Dario // Notifies the XDragSourceListener by calling dragDropEnd
103*cc13e73eSYuri Dario //
startDrag(const DragGestureEvent &,sal_Int8 sourceActions,sal_Int32,sal_Int32,const Reference<XTransferable> & trans,const Reference<XDragSourceListener> & listener)104*cc13e73eSYuri Dario void SAL_CALL DragSource::startDrag(
105*cc13e73eSYuri Dario     const DragGestureEvent& /* trigger */,
106*cc13e73eSYuri Dario     sal_Int8 sourceActions,
107*cc13e73eSYuri Dario     sal_Int32 /* cursor */,
108*cc13e73eSYuri Dario     sal_Int32 /* image */,
109*cc13e73eSYuri Dario     const Reference<XTransferable >& trans,
110*cc13e73eSYuri Dario     const Reference<XDragSourceListener >& listener ) throw( RuntimeException)
111*cc13e73eSYuri Dario {
112*cc13e73eSYuri Dario     debug_printf("DragSource::startDrag hwnd %x, sourceActions %d",
113*cc13e73eSYuri Dario                  m_hWnd, sourceActions);
114*cc13e73eSYuri Dario 
115*cc13e73eSYuri Dario     DRAGITEM    dragItem;
116*cc13e73eSYuri Dario     DRAGIMAGE   dimg;
117*cc13e73eSYuri Dario     HSTR        hstrType, hstrRMF;
118*cc13e73eSYuri Dario     HWND        hwndTarget;
119*cc13e73eSYuri Dario 
120*cc13e73eSYuri Dario     // store transferable for internal AOO d&d operations
121*cc13e73eSYuri Dario     g_XTransferable = trans;
122*cc13e73eSYuri Dario     // store drag source window handle in a global field since we can
123*cc13e73eSYuri Dario     // start only one drag operation at time
124*cc13e73eSYuri Dario     g_DragSourceHwnd = m_hWnd;
125*cc13e73eSYuri Dario 
126*cc13e73eSYuri Dario #if 1
127*cc13e73eSYuri Dario     // dump data flavours
128*cc13e73eSYuri Dario     Sequence<DataFlavor> seq = g_XTransferable->getTransferDataFlavors();
129*cc13e73eSYuri Dario     for( int i=0; i<seq.getLength(); i++) {
130*cc13e73eSYuri Dario         DataFlavor df = seq[i];
131*cc13e73eSYuri Dario         debug_printf("DragSource::startDrag mimetype %s",
132*cc13e73eSYuri Dario                      ::rtl::OUStringToOString( df.MimeType, RTL_TEXTENCODING_UTF8 ).getStr());
133*cc13e73eSYuri Dario     }
134*cc13e73eSYuri Dario #endif
135*cc13e73eSYuri Dario 
136*cc13e73eSYuri Dario     dragSourceListener = listener;
137*cc13e73eSYuri Dario     debug_printf("DragSource::startDrag dragSourceListener 0x%x", dragSourceListener.get());
138*cc13e73eSYuri Dario 
139*cc13e73eSYuri Dario     // allocate OS/2 specific resources
140*cc13e73eSYuri Dario     pSourceDraginfo = DrgAllocDraginfo(1);
141*cc13e73eSYuri Dario     pSourceDraginfo->hwndSource = m_hWnd;
142*cc13e73eSYuri Dario 
143*cc13e73eSYuri Dario     hstrType = DrgAddStrHandle( DRT_TEXT);
144*cc13e73eSYuri Dario     hstrRMF = DrgAddStrHandle( "<DRM_DTSHARE,DRF_TEXT>,<DRM_SHAREDMEM,DRF_TEXT>,<DRM_OS2FILE,DRF_TEXT>");
145*cc13e73eSYuri Dario 
146*cc13e73eSYuri Dario     dragItem.hwndItem          = m_hWnd;
147*cc13e73eSYuri Dario     dragItem.ulItemID          = 1;
148*cc13e73eSYuri Dario     dragItem.hstrType          = hstrType;
149*cc13e73eSYuri Dario     dragItem.hstrRMF           = hstrRMF;
150*cc13e73eSYuri Dario     dragItem.hstrContainerName = NULL; // force rendering
151*cc13e73eSYuri Dario     dragItem.hstrSourceName    = NULL;
152*cc13e73eSYuri Dario     dragItem.hstrTargetName    = NULL;
153*cc13e73eSYuri Dario     dragItem.fsControl         = 0;
154*cc13e73eSYuri Dario     dragItem.fsSupportedOps    = DO_COPYABLE | DO_MOVEABLE | DO_LINKABLE;
155*cc13e73eSYuri Dario 
156*cc13e73eSYuri Dario     dimg.cb       = sizeof(dimg);
157*cc13e73eSYuri Dario     dimg.hImage   = WinQuerySysPointer( HWND_DESKTOP, SPTR_FILE, FALSE);
158*cc13e73eSYuri Dario     dimg.fl       = DRG_ICON | DRG_TRANSPARENT;
159*cc13e73eSYuri Dario     dimg.cxOffset = 0;
160*cc13e73eSYuri Dario     dimg.cyOffset = 0;
161*cc13e73eSYuri Dario 
162*cc13e73eSYuri Dario     DrgSetDragitem( pSourceDraginfo, &dragItem, sizeof(dragItem), 0);
163*cc13e73eSYuri Dario 
164*cc13e73eSYuri Dario     // start PM dragging
165*cc13e73eSYuri Dario     hwndTarget = DrgDrag( m_hWnd, pSourceDraginfo, &dimg, 1L, VK_BUTTON2, NULL);
166*cc13e73eSYuri Dario     if (hwndTarget == NULLHANDLE) {
167*cc13e73eSYuri Dario         // post a dummy message to ourselves to allow freeing resources
168*cc13e73eSYuri Dario         // (yes, we could call endConversation() directly)
169*cc13e73eSYuri Dario         WinPostMsg( m_hWnd, DM_AOO_ENDCONVERSATION,
170*cc13e73eSYuri Dario                     0, MPFROMSHORT(DMFL_TARGETFAIL));
171*cc13e73eSYuri Dario     }
172*cc13e73eSYuri Dario 
173*cc13e73eSYuri Dario     debug_printf("DragSource::startDrag hwndTarget %x", hwndTarget);
174*cc13e73eSYuri Dario 
175*cc13e73eSYuri Dario }
176*cc13e73eSYuri Dario 
177*cc13e73eSYuri Dario // XDragSourceContext
getCurrentCursor()178*cc13e73eSYuri Dario sal_Int32 SAL_CALL DragSource::getCurrentCursor(  )
179*cc13e73eSYuri Dario throw( RuntimeException)
180*cc13e73eSYuri Dario {
181*cc13e73eSYuri Dario     return 0;
182*cc13e73eSYuri Dario }
183*cc13e73eSYuri Dario 
setCursor(sal_Int32)184*cc13e73eSYuri Dario void SAL_CALL DragSource::setCursor( sal_Int32 /*cursorId*/ )
185*cc13e73eSYuri Dario throw( RuntimeException)
186*cc13e73eSYuri Dario {
187*cc13e73eSYuri Dario }
188*cc13e73eSYuri Dario 
setImage(sal_Int32)189*cc13e73eSYuri Dario void SAL_CALL DragSource::setImage( sal_Int32 /*imageId*/ )
190*cc13e73eSYuri Dario throw( RuntimeException)
191*cc13e73eSYuri Dario {
192*cc13e73eSYuri Dario }
193*cc13e73eSYuri Dario 
transferablesFlavorsChanged()194*cc13e73eSYuri Dario void SAL_CALL DragSource::transferablesFlavorsChanged(  )
195*cc13e73eSYuri Dario throw( RuntimeException)
196*cc13e73eSYuri Dario {
197*cc13e73eSYuri Dario }
198*cc13e73eSYuri Dario 
199*cc13e73eSYuri Dario 
200*cc13e73eSYuri Dario //
201*cc13e73eSYuri Dario // XServiceInfo
202*cc13e73eSYuri Dario //
getImplementationName()203*cc13e73eSYuri Dario OUString SAL_CALL DragSource::getImplementationName(  ) throw (RuntimeException)
204*cc13e73eSYuri Dario {
205*cc13e73eSYuri Dario     return OUString(RTL_CONSTASCII_USTRINGPARAM(OS2_DNDSOURCE_IMPL_NAME));;
206*cc13e73eSYuri Dario }
207*cc13e73eSYuri Dario 
supportsService(const OUString & ServiceName)208*cc13e73eSYuri Dario sal_Bool SAL_CALL DragSource::supportsService( const OUString& ServiceName ) throw (RuntimeException)
209*cc13e73eSYuri Dario {
210*cc13e73eSYuri Dario     if( ServiceName.equals(OUString(RTL_CONSTASCII_USTRINGPARAM(OS2_DNDSOURCE_SERVICE_NAME ))))
211*cc13e73eSYuri Dario         return sal_True;
212*cc13e73eSYuri Dario     return sal_False;
213*cc13e73eSYuri Dario }
214*cc13e73eSYuri Dario 
getSupportedServiceNames()215*cc13e73eSYuri Dario Sequence< OUString > SAL_CALL DragSource::getSupportedServiceNames(  ) throw (RuntimeException)
216*cc13e73eSYuri Dario {
217*cc13e73eSYuri Dario     OUString names[1]= {OUString(RTL_CONSTASCII_USTRINGPARAM(OS2_DNDSOURCE_SERVICE_NAME))};
218*cc13e73eSYuri Dario     return Sequence<OUString>(names, 1);
219*cc13e73eSYuri Dario }
220*cc13e73eSYuri Dario 
221*cc13e73eSYuri Dario 
222*cc13e73eSYuri Dario //
223*cc13e73eSYuri Dario // OS/2 specific platform code
224*cc13e73eSYuri Dario //
225*cc13e73eSYuri Dario 
226*cc13e73eSYuri Dario 
227*cc13e73eSYuri Dario //
228*cc13e73eSYuri Dario // AOO as source window vs external drop target.
229*cc13e73eSYuri Dario //
230*cc13e73eSYuri Dario // this is sent when drop target requests the render
231*cc13e73eSYuri Dario //
render(PDRAGTRANSFER pdxfer)232*cc13e73eSYuri Dario MRESULT DragSource::render( PDRAGTRANSFER pdxfer)
233*cc13e73eSYuri Dario {
234*cc13e73eSYuri Dario     APIRET rc;
235*cc13e73eSYuri Dario     ULONG ulLength;
236*cc13e73eSYuri Dario     PSZ pRMF;
237*cc13e73eSYuri Dario     bool rv = false;
238*cc13e73eSYuri Dario 
239*cc13e73eSYuri Dario     ulLength = DrgQueryStrNameLen( pdxfer->hstrSelectedRMF) + 1;
240*cc13e73eSYuri Dario     pRMF = (PSZ) malloc( ulLength);
241*cc13e73eSYuri Dario     DrgQueryStrName( pdxfer->hstrSelectedRMF, ulLength, pRMF);
242*cc13e73eSYuri Dario     debug_printf("DragSource::render RMF:%s", pRMF);
243*cc13e73eSYuri Dario     debug_printf("DragSource::render hstrRenderToName:%x", pdxfer->hstrRenderToName);
244*cc13e73eSYuri Dario 
245*cc13e73eSYuri Dario     if (strstr( pRMF, "<DRM_DTSHARE") != 0) {
246*cc13e73eSYuri Dario 
247*cc13e73eSYuri Dario         char DTShareName[CCHMAXPATH];
248*cc13e73eSYuri Dario 
249*cc13e73eSYuri Dario         DataFlavor df;
250*cc13e73eSYuri Dario         df.MimeType = OUString::createFromAscii( "text/plain;charset=utf-16" );
251*cc13e73eSYuri Dario         df.DataType = getCppuType( static_cast<OUString*>(0));
252*cc13e73eSYuri Dario 
253*cc13e73eSYuri Dario         Any aAny = DragSource::g_XTransferable->getTransferData(df);
254*cc13e73eSYuri Dario         OUString utext;
255*cc13e73eSYuri Dario         aAny >>= utext;
256*cc13e73eSYuri Dario         OString text = ::rtl::OUStringToOString( utext, RTL_TEXTENCODING_UTF8).getStr();
257*cc13e73eSYuri Dario         debug_printf("DragSource::render text:%s", text.getStr());
258*cc13e73eSYuri Dario         debug_printf("DragSource::render text.getLength():%d", text.getLength());
259*cc13e73eSYuri Dario 
260*cc13e73eSYuri Dario         DrgQueryStrName( pdxfer->hstrRenderToName, sizeof(DTShareName),
261*cc13e73eSYuri Dario                          DTShareName);
262*cc13e73eSYuri Dario         debug_printf("DragSource::render hstrRenderToName:%s", DTShareName);
263*cc13e73eSYuri Dario 
264*cc13e73eSYuri Dario         rc = DosGetNamedSharedMem( (PPVOID) &pDTShareMem, DTShareName,
265*cc13e73eSYuri Dario                                    PAG_WRITE | PAG_READ);
266*cc13e73eSYuri Dario         debug_printf("DragSource::render DosGetNamedSharedMem rc:%d", rc);
267*cc13e73eSYuri Dario         debug_printf("DragSource::render DosGetNamedSharedMem pSharedMem:%x", pSharedMem);
268*cc13e73eSYuri Dario 
269*cc13e73eSYuri Dario         // the memory is still not committed
270*cc13e73eSYuri Dario         rc = DosSetMem( pDTShareMem, text.getLength()+1, PAG_DEFAULT | PAG_COMMIT);
271*cc13e73eSYuri Dario         debug_printf("DragSource::render DosSetMem rc:%d", rc);
272*cc13e73eSYuri Dario 
273*cc13e73eSYuri Dario         // first ULONG is text length
274*cc13e73eSYuri Dario         *(ULONG*) pDTShareMem = text.getLength();
275*cc13e73eSYuri Dario         // text data from 2nd ULONG
276*cc13e73eSYuri Dario         memcpy( pDTShareMem + sizeof(ULONG), text.getStr(),
277*cc13e73eSYuri Dario                 text.getLength()+1);
278*cc13e73eSYuri Dario 
279*cc13e73eSYuri Dario         // return success
280*cc13e73eSYuri Dario         rv = true;
281*cc13e73eSYuri Dario 
282*cc13e73eSYuri Dario     } else if (strstr( pRMF, "<DRM_SHAREDMEM") != 0) {
283*cc13e73eSYuri Dario 
284*cc13e73eSYuri Dario         PID pid;
285*cc13e73eSYuri Dario         TID tid;
286*cc13e73eSYuri Dario         DataFlavor df;
287*cc13e73eSYuri Dario         df.MimeType = OUString::createFromAscii( "text/plain;charset=utf-16" );
288*cc13e73eSYuri Dario         df.DataType = getCppuType( static_cast<OUString*>(0));
289*cc13e73eSYuri Dario 
290*cc13e73eSYuri Dario         Any aAny = DragSource::g_XTransferable->getTransferData(df);
291*cc13e73eSYuri Dario         OUString utext;
292*cc13e73eSYuri Dario         aAny >>= utext;
293*cc13e73eSYuri Dario         OString text = ::rtl::OUStringToOString( utext, RTL_TEXTENCODING_UTF8).getStr();
294*cc13e73eSYuri Dario         debug_printf("DragSource::render text:%s", text.getStr());
295*cc13e73eSYuri Dario         debug_printf("DragSource::render text.getLength():%d", text.getLength());
296*cc13e73eSYuri Dario 
297*cc13e73eSYuri Dario         rc = DosAllocSharedMem( (PPVOID) &pSharedMem, NULL,
298*cc13e73eSYuri Dario                                        text.getLength()+sizeof(ULONG)+1,
299*cc13e73eSYuri Dario                                        OBJ_GIVEABLE | PAG_COMMIT |
300*cc13e73eSYuri Dario                                        PAG_WRITE | PAG_READ /*| OBJ_ANY*/);
301*cc13e73eSYuri Dario 
302*cc13e73eSYuri Dario         rc = WinQueryWindowProcess( pdxfer->hwndClient, &pid, &tid);
303*cc13e73eSYuri Dario         rc = DosGiveSharedMem( pSharedMem, pid, PAG_READ);
304*cc13e73eSYuri Dario 
305*cc13e73eSYuri Dario         debug_printf("DragSource::render rc:%d", rc);
306*cc13e73eSYuri Dario         *(ULONG *) pSharedMem = text.getLength();
307*cc13e73eSYuri Dario         memcpy( pSharedMem + sizeof(ULONG), text.getStr(), text.getLength()+1);
308*cc13e73eSYuri Dario         pdxfer->hstrRenderToName = (HSTR) pSharedMem;
309*cc13e73eSYuri Dario 
310*cc13e73eSYuri Dario         // return success
311*cc13e73eSYuri Dario         rv = true;
312*cc13e73eSYuri Dario 
313*cc13e73eSYuri Dario     } else if (strstr( pRMF, "<DRM_OS2FILE") != 0) {
314*cc13e73eSYuri Dario 
315*cc13e73eSYuri Dario         char fileName[CCHMAXPATH];
316*cc13e73eSYuri Dario 
317*cc13e73eSYuri Dario         DataFlavor df;
318*cc13e73eSYuri Dario         df.MimeType = OUString::createFromAscii( "text/plain;charset=utf-16" );
319*cc13e73eSYuri Dario         df.DataType = getCppuType( static_cast<OUString*>(0));
320*cc13e73eSYuri Dario 
321*cc13e73eSYuri Dario         Any aAny = DragSource::g_XTransferable->getTransferData(df);
322*cc13e73eSYuri Dario         OUString utext;
323*cc13e73eSYuri Dario         aAny >>= utext;
324*cc13e73eSYuri Dario         OString text = ::rtl::OUStringToOString( utext, RTL_TEXTENCODING_UTF8).getStr();
325*cc13e73eSYuri Dario         debug_printf("DragSource::render text:%s", text.getStr());
326*cc13e73eSYuri Dario         debug_printf("DragSource::render text.getLength():%d", text.getLength());
327*cc13e73eSYuri Dario 
328*cc13e73eSYuri Dario         DrgQueryStrName( pdxfer->hstrRenderToName, sizeof(fileName), fileName);
329*cc13e73eSYuri Dario         debug_printf("DragSource::render hstrRenderToName:%s", fileName);
330*cc13e73eSYuri Dario 
331*cc13e73eSYuri Dario         // write data to target file
332*cc13e73eSYuri Dario         FILE* tmp = fopen( fileName, "wb");
333*cc13e73eSYuri Dario         if (tmp) {
334*cc13e73eSYuri Dario             fwrite( text.getStr(), 1, text.getLength(), tmp);
335*cc13e73eSYuri Dario             fclose( tmp);
336*cc13e73eSYuri Dario             rv = true;
337*cc13e73eSYuri Dario         }
338*cc13e73eSYuri Dario 
339*cc13e73eSYuri Dario     } else {
340*cc13e73eSYuri Dario 
341*cc13e73eSYuri Dario         debug_printf("DragSource::render INTERNAL ERROR unknown type");
342*cc13e73eSYuri Dario 
343*cc13e73eSYuri Dario     }
344*cc13e73eSYuri Dario 
345*cc13e73eSYuri Dario     free( pRMF);
346*cc13e73eSYuri Dario 
347*cc13e73eSYuri Dario     // post rendered data
348*cc13e73eSYuri Dario     int renderOK = (rv==true) ? DMFL_RENDEROK : DMFL_RENDERFAIL;
349*cc13e73eSYuri Dario     debug_printf("DragSource::render render:%d", renderOK);
350*cc13e73eSYuri Dario     rc = DrgPostTransferMsg( pdxfer->hwndClient, DM_RENDERCOMPLETE, pdxfer,
351*cc13e73eSYuri Dario                         renderOK, 0, FALSE);
352*cc13e73eSYuri Dario     debug_printf("DragSource::render DrgPostTransferMsg:%d", rc);
353*cc13e73eSYuri Dario 
354*cc13e73eSYuri Dario     // free resources
355*cc13e73eSYuri Dario     DrgFreeDragtransfer(pdxfer);
356*cc13e73eSYuri Dario 
357*cc13e73eSYuri Dario     return (MRESULT) rv;
358*cc13e73eSYuri Dario }
359*cc13e73eSYuri Dario 
360*cc13e73eSYuri Dario //
361*cc13e73eSYuri Dario // AOO as source window vs external drop target.
362*cc13e73eSYuri Dario //
363*cc13e73eSYuri Dario // this is sent when external drop target requests the render
364*cc13e73eSYuri Dario //
endConversation(ULONG itemID,ULONG flags)365*cc13e73eSYuri Dario MRESULT DragSource::endConversation( ULONG itemID, ULONG flags)
366*cc13e73eSYuri Dario {
367*cc13e73eSYuri Dario     sal_Bool success = ((flags==DMFL_TARGETSUCCESSFUL) ? true : false);
368*cc13e73eSYuri Dario     sal_Int8 effect = ACTION_NONE;
369*cc13e73eSYuri Dario 
370*cc13e73eSYuri Dario     debug_printf("DragSource::endConversation itemID %d, flags %d", itemID, flags);
371*cc13e73eSYuri Dario 
372*cc13e73eSYuri Dario     if (pDTShareMem)
373*cc13e73eSYuri Dario         DosFreeMem( pDTShareMem);
374*cc13e73eSYuri Dario     pDTShareMem = NULL;
375*cc13e73eSYuri Dario     if (pSharedMem)
376*cc13e73eSYuri Dario         DosFreeMem( pSharedMem);
377*cc13e73eSYuri Dario     pSharedMem = NULL;
378*cc13e73eSYuri Dario 
379*cc13e73eSYuri Dario     if (pSourceDraginfo) {
380*cc13e73eSYuri Dario         // query which kind of operation the target did with our data
381*cc13e73eSYuri Dario         if (success == true)
382*cc13e73eSYuri Dario             effect = SystemToOfficeDragActions( pSourceDraginfo->usOperation);
383*cc13e73eSYuri Dario         debug_printf("DragSource::endConversation usOperation 0x%x", pSourceDraginfo->usOperation);
384*cc13e73eSYuri Dario         DrgDeleteDraginfoStrHandles( pSourceDraginfo);
385*cc13e73eSYuri Dario         DrgFreeDraginfo( pSourceDraginfo);
386*cc13e73eSYuri Dario     }
387*cc13e73eSYuri Dario     pSourceDraginfo = NULL;
388*cc13e73eSYuri Dario 
389*cc13e73eSYuri Dario     // terminate AOO drag
390*cc13e73eSYuri Dario     DragSourceDropEvent de(static_cast<OWeakObject*>(this),
391*cc13e73eSYuri Dario                            static_cast<XDragSourceContext*>(this),
392*cc13e73eSYuri Dario                            static_cast<XDragSource*>(this),
393*cc13e73eSYuri Dario                            effect,
394*cc13e73eSYuri Dario                            success);
395*cc13e73eSYuri Dario     dragSourceListener->dragDropEnd( de);
396*cc13e73eSYuri Dario 
397*cc13e73eSYuri Dario     // clear globals
398*cc13e73eSYuri Dario     g_XTransferable = Reference<XTransferable>();
399*cc13e73eSYuri Dario     g_DragSourceHwnd = NULLHANDLE;
400*cc13e73eSYuri Dario     dragSourceListener = Reference<XDragSourceListener>();
401*cc13e73eSYuri Dario 
402*cc13e73eSYuri Dario     // Reserved value, should be 0
403*cc13e73eSYuri Dario     return 0;
404*cc13e73eSYuri Dario }
405