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 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 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 // 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 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 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 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 // 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 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 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 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 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 // 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 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 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 // 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 // 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