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