VBoxDnD.cpp revision be2d64b9017ca17cf597a73767a1cf928a7e3f7d
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* $Id$ */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/** @file
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * VBoxDnD.cpp - Windows-specific bits of the drag'n drop service.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/*
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * Copyright (C) 2013-2014 Oracle Corporation
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * available from http://www.virtualbox.org. This file is free software;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * you can redistribute it and/or modify it under the terms of the GNU
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * General Public License (GPL) as published by the Free Software
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <windows.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBoxTray.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBoxHelpers.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBoxDnD.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <VBox/VBoxGuestLib.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBox/HostServices/DragAndDropSvc.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/asm.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/assert.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/err.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/ldr.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/list.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/mem.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/cpp/mtlist.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/cpp/ministring.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/cpp/mtlist.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <VBoxGuestInternal.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* Enable this define to see the proxy window(s) when debugging
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * their behavior. Don't have this enabled in release builds! */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef DEBUG
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync//# define VBOX_DND_DEBUG_WND
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync/** @todo Merge this with messages from VBoxTray.h. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#define WM_VBOXTRAY_DND_MESSAGE WM_APP + 401
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync/** Function pointer for SendInput(). This only is available starting
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync * at NT4 SP3+. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsynctypedef BOOL (WINAPI *PFNSENDINPUT)(UINT, LPINPUT, int);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync/** Static pointer to SendInput() function. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsyncstatic PFNSENDINPUT s_pfnSendInput = NULL;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncstatic LRESULT CALLBACK vboxDnDWndProcInstance(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncstatic LRESULT CALLBACK vboxDnDWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncVBoxDnDWnd::VBoxDnDWnd(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync : hWnd(NULL),
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync mpfnEnumDisplayMonitors(NULL),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mfMouseButtonDown(false),
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pDropTarget(NULL),
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mClientID(UINT32_MAX),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mMode(Unknown),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mState(Uninitialized)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RT_ZERO(startupInfo);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync reset();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncVBoxDnDWnd::~VBoxDnDWnd(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** @todo Shutdown crit sect / event etc! */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync reset();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::Initialize(PVBOXDNDCONTEXT pContext)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pContext, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Save the context. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync this->pContext = pContext;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync HMODULE hUser = GetModuleHandle("user32.dll");
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync if (hUser)
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync {
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync *(uintptr_t *)&mpfnEnumDisplayMonitors = (uintptr_t)GetProcAddress(hUser, "EnumDisplayMonitors");
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync Log(("DnD: EnumDisplayMonitors = %p\n", mpfnEnumDisplayMonitors));
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync }
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = RTSemEventCreate(&mEventSem);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTCritSectInit(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Message pump thread for our proxy window. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTThreadCreate(&gCtx.hEvtQueue, VBoxDnDWnd::Thread, this,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync 0, RTTHREADTYPE_MSG_PUMP, RTTHREADFLAGS_WAITABLE,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync "VBoxTrayDnDWnd");
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogRel(("DnD: Failed to start proxy window thread, rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** @todo Wait for thread to be started! */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Returning rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/**
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Thread for handling the window's message pump.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return IPRT status code.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param hThread
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pvUser
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* static */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::Thread(RTTHREAD hThread, void *pvUser)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pvUser, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBoxDnDWnd *pThis = (VBoxDnDWnd*)pvUser;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pThis);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVBOXDNDCONTEXT pContext = pThis->pContext;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pContext);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pContext->pEnv);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync HINSTANCE hInstance = pContext->pEnv->hInstance;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Assert(hInstance != 0);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Create our proxy window. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync WNDCLASSEX wndClass;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RT_ZERO(wndClass);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.cbSize = sizeof(WNDCLASSEX);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.lpfnWndProc = vboxDnDWndProc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.lpszClassName = "VBoxTrayDnDWnd";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.hInstance = hInstance;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.style = CS_NOCLOSE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef VBOX_DND_DEBUG_WND
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.style |= CS_HREDRAW | CS_VREDRAW;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.hbrBackground = (HBRUSH)(CreateSolidBrush(RGB(255, 0, 0)));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync wndClass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (!RegisterClassEx(&wndClass))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DWORD dwErr = GetLastError();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Unable to register proxy window class, error=%ld\n", dwErr));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTErrConvertFromWin32(dwErr);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_TRANSPARENT | WS_EX_NOACTIVATE;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync DWORD dwStyle = WS_POPUP;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef VBOX_DND_DEBUG_WND
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync dwExStyle &= ~WS_EX_TRANSPARENT; /* Remove transparency bit. */
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync dwStyle |= WS_VISIBLE; /* Make the window visible. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pThis->hWnd =
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync CreateWindowEx(dwExStyle,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync "VBoxTrayDnDWnd", "VBoxTrayDnDWnd",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync dwStyle,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef VBOX_DND_DEBUG_WND
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync CW_USEDEFAULT, CW_USEDEFAULT, 200, 200, NULL, NULL,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync -200, -200, 100, 100, NULL, NULL,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hInstance, pThis /* lParm */);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (!pThis->hWnd)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DWORD dwErr = GetLastError();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Unable to create proxy window, error=%ld\n", dwErr));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTErrConvertFromWin32(dwErr);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifndef VBOX_DND_DEBUG_WND
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync SetWindowPos(pThis->hWnd, HWND_TOPMOST, -200, -200, 0, 0,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync SWP_NOACTIVATE | SWP_HIDEWINDOW
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync | SWP_NOCOPYBITS | SWP_NOREDRAW | SWP_NOSIZE);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Proxy window created, hWnd=0x%x\n", pThis->hWnd));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Debug proxy window created, hWnd=0x%x\n", pThis->hWnd));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync /*
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * Install some mouse tracking.
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync */
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync TRACKMOUSEEVENT me;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync RT_ZERO(me);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync me.cbSize = sizeof(TRACKMOUSEEVENT);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync me.dwFlags = TME_HOVER | TME_LEAVE | TME_NONCLIENT;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync me.hwndTrack = pThis->hWnd;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync BOOL fRc = TrackMouseEvent(&me);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync Assert(fRc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync HRESULT hr = OleInitialize(NULL);
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync if (SUCCEEDED(hr))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync rc = pThis->RegisterAsDropTarget();
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync#endif
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync }
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync else
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync {
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync LogRelFunc(("Unable to initialize OLE, hr=%Rhrc\n", hr));
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync rc = VERR_COM_UNEXPECTED;
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync }
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync if (RT_SUCCESS(rc))
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync bool fShutdown = false;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync do
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync MSG uMsg;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync while (GetMessage(&uMsg, 0, 0, 0))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync TranslateMessage(&uMsg);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DispatchMessage(&uMsg);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (ASMAtomicReadBool(&pContext->fShutdown))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync fShutdown = true;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (fShutdown)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Cancelling ...\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** @todo Immediately drop on failure? */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync } while (RT_SUCCESS(rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
eec8c0f9948580ef06e396e8b9c34428d0b78cd9vboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync int rc2 = pThis->UnregisterAsDropTarget();
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync if (RT_SUCCESS(rc))
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = rc2;
eec8c0f9948580ef06e396e8b9c34428d0b78cd9vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync OleUninitialize();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncLeaveRC(rc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* static */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncBOOL CALLBACK VBoxDnDWnd::MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LPRECT lprcMonitor, LPARAM lParam)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LPRECT pRect = (LPRECT)lParam;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pRect, FALSE);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(lprcMonitor);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Monitor is %ld,%ld,%ld,%ld\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync lprcMonitor->left, lprcMonitor->top,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync lprcMonitor->right, lprcMonitor->bottom));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Build up a simple bounding box to hold the entire (virtual) screen. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pRect->left > lprcMonitor->left)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pRect->left = lprcMonitor->left;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pRect->right < lprcMonitor->right)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pRect->right = lprcMonitor->right;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pRect->top > lprcMonitor->top)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pRect->top = lprcMonitor->top;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pRect->bottom < lprcMonitor->bottom)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pRect->bottom = lprcMonitor->bottom;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return TRUE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncLRESULT CALLBACK VBoxDnDWnd::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync switch (uMsg)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case WM_CREATE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = OnCreate();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return FALSE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return TRUE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case WM_CLOSE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync OnDestroy();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DestroyWindow(hWnd);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PostQuitMessage(0);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case WM_LBUTTONDOWN:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("WM_LBUTTONDOWN\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mfMouseButtonDown = true;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case WM_LBUTTONUP:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("WM_LBUTTONUP\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mfMouseButtonDown = false;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync case WM_MOUSELEAVE:
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogFlowThisFunc(("WM_MOUSELEAVE\n"));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync return 0;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Will only be called once; after the first mouse move, this
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * window will be hidden! */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case WM_MOUSEMOVE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("WM_MOUSEMOVE: mfMouseButtonDown=%RTbool, mMode=%ld, mState=%ld\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mfMouseButtonDown, mMode, mState));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef DEBUG_andy
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync POINT p;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync GetCursorPos(&p);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("WM_MOUSEMOVE: curX=%ld, curY=%ld\n", p.x, p.y));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int rc = VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (mMode == HG) /* Host to guest. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* Dragging not started yet? Kick it off ... */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if ( mfMouseButtonDown
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync && (mState != Dragging))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mState = Dragging;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#if 0
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* Delay hiding the proxy window a bit when debugging, to see
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * whether the desired range is covered correctly. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTThreadSleep(5000);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync hide();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("Starting drag'n drop: uAllActions=0x%x, dwOKEffects=0x%x ...\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync uAllActions, startupInfo.dwOKEffects));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync AssertPtr(startupInfo.pDataObject);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync AssertPtr(startupInfo.pDropSource);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync DWORD dwEffect;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync HRESULT hr = DoDragDrop(startupInfo.pDataObject, startupInfo.pDropSource,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync startupInfo.dwOKEffects, &dwEffect);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync LogFlowThisFunc(("hr=%Rhrc, dwEffect=%RI32\n", hr, dwEffect));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync switch (hr)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync case DRAGDROP_S_DROP:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mState = Dropped;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync break;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync case DRAGDROP_S_CANCEL:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mState = Canceled;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync break;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync default:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("Drag'n drop failed with %Rhrc\n", hr));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mState = Canceled;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_GENERAL_FAILURE; /** @todo Find a better status code. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync break;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int rc2 = RTCritSectEnter(&mCritSect);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (RT_SUCCESS(rc2))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync startupInfo.pDropSource->Release();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync startupInfo.pDataObject->Release();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RT_ZERO(startupInfo);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc2 = RTCritSectLeave(&mCritSect);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (RT_SUCCESS(rc))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = rc2;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mMode = Unknown;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else if (mMode == GH) /* Guest to host. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync //hide();
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync /* Starting here VBoxDnDDropTarget should
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * take over; was instantiated when registering
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * this proxy window as a (valid) drop target. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_NOT_SUPPORTED;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("WM_MOUSEMOVE: mMode=%ld, mState=%ld, rc=%Rrc\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mMode, mState, rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync case WM_NCMOUSEHOVER:
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogFlowThisFunc(("WM_NCMOUSEHOVER\n"));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync return 0;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync case WM_NCMOUSELEAVE:
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogFlowThisFunc(("WM_NCMOUSELEAVE\n"));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync return 0;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case WM_VBOXTRAY_DND_MESSAGE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBOXDNDEVENT *pEvent = (PVBOXDNDEVENT)lParam;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pEvent);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Received uType=%RU32, uScreenID=%RU32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pEvent->Event.uType, pEvent->Event.uScreenId));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync switch (pEvent->Event.uType)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_ENTER:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_HG_EVT_ENTER\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync reset();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mMode = HG;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pEvent->Event.cbFormats)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCList<RTCString> lstFormats =
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCString(pEvent->Event.pszFormats, pEvent->Event.cbFormats - 1).split("\r\n");
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = OnHgEnter(lstFormats, pEvent->Event.u.a.uAllActions);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertMsgFailed(("cbFormats is 0\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_INVALID_PARAMETER;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Note: After HOST_DND_HG_EVT_ENTER there immediately is a move
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * event, so fall through is intentional here. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_HG_EVT_MOVE: %d,%d\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pEvent->Event.u.a.uXpos, pEvent->Event.u.a.uYpos));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = OnHgMove(pEvent->Event.u.a.uXpos, pEvent->Event.u.a.uYpos,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pEvent->Event.u.a.uDefAction);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_LEAVE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_HG_EVT_LEAVE\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = OnHgLeave();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_HG_EVT_DROPPED\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = OnHgDrop();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_SND_DATA:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_HG_SND_DATA\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = OnHgDataReceived(pEvent->Event.u.b.pvData,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pEvent->Event.u.b.cbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_CANCEL:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_HG_EVT_CANCEL\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = OnHgCancel();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_GH_REQ_PENDING:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_GH_REQ_PENDING\n"));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync if ( mMode == Unknown
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync /* There can be more than one HOST_DND_GH_REQ_PENDING
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync * messages coming in. */
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync || mMode == GH)
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync {
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync mMode = GH;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = OnGhIsDnDPending(pEvent->Event.uScreenId);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync }
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync else
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = VERR_WRONG_ORDER;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_NOT_SUPPORTED;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_GH_EVT_DROPPED:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("HOST_DND_GH_EVT_DROPPED\n"));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync if (mMode == GH)
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync {
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = OnGhDropped(pEvent->Event.pszFormats,
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync pEvent->Event.cbFormats,
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync pEvent->Event.u.a.uDefAction);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync }
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync else
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = VERR_WRONG_ORDER;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_NOT_SUPPORTED;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::GUEST_DND_GH_EVT_ERROR:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("GUEST_DND_GH_EVT_ERROR\n"));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync reset();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VINF_SUCCESS; /** @todo GUEST_DND_GH_EVT_ERROR */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_NOT_SUPPORTED;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync case DragAndDropSvc::HOST_DND_GH_RECV_DIR:
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync {
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowThisFunc(("HOST_DND_GH_RECV_DIR\n"));
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync if (mMode == GH)
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync {
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = OnGhSendDir(pEvent->Event.pszFormats,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync pEvent->Event.cbFormats,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync pEvent->Event.u.a.uDefAction);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync }
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync else
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = VERR_WRONG_ORDER;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync#else
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = VERR_NOT_SUPPORTED;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync#endif
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync break;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync }
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync case DragAndDropSvc::HOST_DND_GH_RECV_FILE:
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync {
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowThisFunc(("HOST_DND_GH_RECV_FILE\n"));
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync if (mMode == GH)
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync {
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = OnGhSendFile(pEvent->Event.pszFormats,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync pEvent->Event.cbFormats,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync pEvent->Event.u.a.uDefAction);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync }
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync else
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = VERR_WRONG_ORDER;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync#else
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = VERR_NOT_SUPPORTED;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync#endif
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync break;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync }
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync default:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NOT_SUPPORTED;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Some messages require cleanup. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync switch (pEvent->Event.uType)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_ENTER:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_MOVE:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_EVT_DROPPED:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_GH_EVT_DROPPED:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pEvent->Event.pszFormats)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTMemFree(pEvent->Event.pszFormats);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case DragAndDropSvc::HOST_DND_HG_SND_DATA:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pEvent->Event.pszFormats)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTMemFree(pEvent->Event.pszFormats);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pEvent->Event.u.b.pvData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTMemFree(pEvent->Event.u.b.pvData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync default:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Ignore. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Processing event %RU32 resulted in rc=%Rrc\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pEvent->Event.uType, rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pEvent)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTMemFree(pEvent);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync default:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return DefWindowProc(hWnd, uMsg, wParam, lParam);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync/**
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * Registers this proxy window as a local drop target.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync *
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * @return IPRT status code.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncint VBoxDnDWnd::RegisterAsDropTarget(void)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (pDropTarget) /* Already registered as drop target? */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync int rc;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync try
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync pDropTarget = new VBoxDnDDropTarget(this /* pParent */);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync AssertPtr(pDropTarget);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync HRESULT hr = CoLockObjectExternal(pDropTarget, TRUE /* fLock */,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync FALSE /* fLastUnlockReleases */);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (SUCCEEDED(hr))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync hr = RegisterDragDrop(hWnd, pDropTarget);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (FAILED(hr))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogRel(("DnD: Creating drop target failed with hr=%Rhrc\n", hr));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_GENERAL_FAILURE; /** @todo Find a better rc. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync else
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync rc = VINF_SUCCESS;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync }
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync }
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync catch (std::bad_alloc)
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync rc = VERR_NO_MEMORY;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFuncLeaveRC(rc);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return rc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync}
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncint VBoxDnDWnd::UnregisterAsDropTarget(void)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync LogFlowFuncEnter();
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (!pDropTarget) /* No drop target? Bail out. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync HRESULT hr = RevokeDragDrop(hWnd);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (SUCCEEDED(hr))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync hr = CoLockObjectExternal(pDropTarget, FALSE /* fLock */,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync TRUE /* fLastUnlockReleases */);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (SUCCEEDED(hr))
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync {
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync ULONG cRefs = pDropTarget->Release();
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync Assert(cRefs == 0);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync pDropTarget = NULL;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int rc = SUCCEEDED(hr)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync ? VINF_SUCCESS : VERR_GENERAL_FAILURE; /** @todo Fix this. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFuncLeaveRC(rc);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return rc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync}
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnCreate(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VbglR3DnDConnect(&mClientID);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Connection to host service failed, rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("Client ID=%RU32, rc=%Rrc\n", mClientID, rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDWnd::OnDestroy(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VbglR3DnDDisconnect(mClientID);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFuncLeave();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnHgEnter(const RTCList<RTCString> &lstFormats, uint32_t uAllActions)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef DEBUG
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("uActions=0x%x, lstFormats=%zu: ", uAllActions, lstFormats.size()));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (size_t i = 0; i < lstFormats.size(); i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlow(("'%s' ", lstFormats.at(i).c_str()));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlow(("\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Save all allowed actions. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync this->uAllActions = uAllActions;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /*
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Install our allowed MIME types.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ** @todo See todo for m_sstrAllowedMimeTypes in GuestDnDImpl.cpp.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync const RTCList<RTCString> lstAllowedMimeTypes = RTCList<RTCString>()
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync /* URI's */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "text/uri-list"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Text */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "text/plain;charset=utf-8"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "UTF8_STRING"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "text/plain"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "COMPOUND_TEXT"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "TEXT"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "STRING"
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync /* OpenOffice formats */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "application/x-openoffice-embed-source-xml;windows_formatname=\"Star Embed Source (XML)\""
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync << "application/x-openoffice-drawing;windows_formatname=\"Drawing Format\"";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync this->lstAllowedFormats = lstAllowedMimeTypes;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /*
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Check MIME compatibility with this client.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Supported MIME types:\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (size_t i = 0; i < lstFormats.size(); i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync bool fSupported = lstAllowedFormats.contains(lstFormats.at(i));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (fSupported)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync this->lstFormats.append(lstFormats.at(i));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("\t%s: %RTbool\n", lstFormats.at(i).c_str(), fSupported));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /*
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Prepare the startup info for DoDragDrop().
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync try
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Translate our drop actions into
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * allowed Windows drop effects. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.dwOKEffects = DROPEFFECT_NONE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (uAllActions)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (uAllActions & DND_COPY_ACTION)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.dwOKEffects |= DROPEFFECT_COPY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (uAllActions & DND_MOVE_ACTION)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.dwOKEffects |= DROPEFFECT_MOVE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (uAllActions & DND_LINK_ACTION)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.dwOKEffects |= DROPEFFECT_LINK;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.pDropSource = new VBoxDnDDropSource(this);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.pDataObject = new VBoxDnDDataObject();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync catch (std::bad_alloc)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NO_MEMORY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = makeFullscreen();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncLeaveRC(rc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnHgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAction)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("u32xPos=%RU32, u32yPos=%RU32, uAction=0x%x\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync u32xPos, u32yPos, uAction));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int rc = mouseMove(u32xPos, u32yPos, MOUSEEVENTF_LEFTDOWN);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint32_t uActionNotify = DND_IGNORE_ACTION;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (RT_SUCCESS(rc))
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = RTCritSectEnter(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if ( (Dragging == mState)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && startupInfo.pDropSource)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uActionNotify = startupInfo.pDropSource->GetCurrentAction();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCritSectLeave(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VbglR3DnDHGAcknowledgeOperation(mClientID, uActionNotify);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogFlowThisFunc(("Acknowledging operation failed with rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Returning uActionNotify=0x%x, rc=%Rrc\n", uActionNotify, rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnHgLeave(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("mMode=%ld, mState=%RU32\n", mMode, mState));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogRel(("DnD: Drag'n drop operation aborted\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync reset();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Post ESC to our window to officially abort the
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * drag'n drop operation. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PostMessage(hWnd, WM_KEYDOWN, VK_ESCAPE, 0 /* lParam */);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncLeaveRC(rc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnHgDrop(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("mMode=%ld, mState=%RU32\n", mMode, mState));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mState == Dragging)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Assert(lstFormats.size() >= 1);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** @todo What to do when multiple formats are available? */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mFormatRequested = lstFormats.at(0);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTCritSectEnter(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (startupInfo.pDataObject)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.pDataObject->SetStatus(VBoxDnDDataObject::Dropping);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NOT_FOUND;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCritSectLeave(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogRel(("DnD: Requesting data as '%s' ...\n", mFormatRequested.c_str()));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VbglR3DnDHGRequestData(mClientID, mFormatRequested.c_str());
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("Requesting data failed with rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncLeaveRC(rc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnHgDataReceived(const void *pvData, uint32_t cbData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowThisFunc(("mState=%ld, pvData=%p, cbData=%RU32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mState, pvData, cbData));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mState = Dropped;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pvData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Assert(cbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTCritSectEnter(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (startupInfo.pDataObject)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = startupInfo.pDataObject->Signal(mFormatRequested, pvData, cbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NOT_FOUND;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCritSectLeave(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int rc2 = mouseRelease();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = rc2;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncLeaveRC(rc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::OnHgCancel(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = RTCritSectEnter(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (startupInfo.pDataObject)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync startupInfo.pDataObject->Abort();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCritSectLeave(&mCritSect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int rc2 = mouseRelease();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = rc2;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync reset();
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncint VBoxDnDWnd::OnGhIsDnDPending(uint32_t uScreenID)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("mMode=%ld, mState=%ld, uScreenID=%RU32\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mMode, mState, uScreenID));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (mState == Uninitialized)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync reset();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int rc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (mState == Initialized)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync rc = makeFullscreen();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (RT_SUCCESS(rc))
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync /*
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * We have to release the left mouse button to
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * get into our (invisible) proxy window.
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync mouseRelease();
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync /*
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * Even if we just released the left mouse button
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * we're still in the dragging state to handle our
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * own drop target (for the host).
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mState = Dragging;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync /**
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * Some notes regarding guest cursor movement:
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * - The host only sends an HOST_DND_GH_REQ_PENDING message to the guest
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * if the mouse cursor is outside the VM's window.
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * - The guest does not know anything about the host's cursor
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * position / state due to security reasons.
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * - The guest *only* knows that the host currently is asking whether a
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync * guest DnD operation is in progress.
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync */
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if ( RT_SUCCESS(rc)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync && (mState == Dragging))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** @todo Put this block into a function! */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync POINT p;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync GetCursorPos(&p);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync ClientToScreen(hWnd, &p);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef DEBUG_andy
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogFlowThisFunc(("Client to screen curX=%ld, curY=%ld\n", p.x, p.y));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** @todo Multi-monitor setups? */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int iScreenX = GetSystemMetrics(SM_CXSCREEN) - 1;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int iScreenY = GetSystemMetrics(SM_CYSCREEN) - 1;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync static LONG px = p.x;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync if (px <= 0)
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync px = 1;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync static LONG py = p.y;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync if (py <= 0)
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync py = 1;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = mouseMove(px, py, 0 /* dwMouseInputFlags */);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync if (RT_SUCCESS(rc))
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync uint32_t uDefAction = DND_IGNORE_ACTION;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync AssertPtr(pDropTarget);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync RTCString strFormats = pDropTarget->Formats();
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync if (!strFormats.isEmpty())
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync uDefAction = DND_COPY_ACTION;
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync uAllActions = uDefAction;
9725ca270919a5220a25cca2c05f4d85bf0f79e2vboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowFunc(("Acknowledging pDropTarget=0x%p, uDefAction=0x%x, uAllActions=0x%x, strFormats=%s\n",
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync pDropTarget, uDefAction, uAllActions, strFormats.c_str()));
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = VbglR3DnDGHAcknowledgePending(mClientID,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync uDefAction, uAllActions, strFormats.c_str());
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync }
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync else
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowFunc(("No format data available yet\n"));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFuncLeaveRC(rc);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsyncint VBoxDnDWnd::OnGhDropped(const char *pszFormat, uint32_t cbFormats,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync uint32_t uDefAction)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync AssertPtrReturn(pszFormat, VERR_INVALID_POINTER);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync AssertReturn(cbFormats, VERR_INVALID_PARAMETER);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowThisFunc(("mMode=%ld, mState=%ld, pDropTarget=0x%p, uDefAction=0x%x\n",
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync mMode, mState, pDropTarget, uDefAction));
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int rc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (mState == Dragging)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync AssertPtr(pDropTarget);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync rc = pDropTarget->WaitForDrop(30 * 1000 /* Timeout in ms */);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync if (RT_SUCCESS(rc))
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync {
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync /** @todo Respect uDefAction. */
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync /** @todo Do data checking / conversion based on pszFormats. */
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync void *pvData = pDropTarget->DataMutableRaw();
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync AssertPtr(pvData);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync uint32_t cbData = pDropTarget->DataSize();
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync Assert(cbData);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync rc = VbglR3DnDGHSendData(mClientID, pvData, cbData);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync LogFlowFunc(("Sent pvData=0x%p, cbData=%RU32, rc=%Rrc\n",
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync pvData, cbData, rc));
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync }
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync reset();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_WRONG_ORDER;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFuncLeaveRC(rc);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsyncint VBoxDnDWnd::OnGhSendDir(const char *pszFormats, uint32_t cbFormats,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync uint32_t uDefAction)
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync{
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync int rc = 0;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowFuncLeaveRC(rc);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync return rc;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync}
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync
00331fbaff118e6a5077fe96327aca51a70459dbvboxsyncint VBoxDnDWnd::OnGhSendFile(const char *pszFormats, uint32_t cbFormats,
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync uint32_t uDefAction)
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync{
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync int rc = 0;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync LogFlowFuncLeaveRC(rc);
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync return rc;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif /* VBOX_WITH_DRAG_AND_DROP_GH */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDWnd::ProcessEvent(PVBOXDNDEVENT pEvent)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pEvent, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PostMessage(hWnd, WM_VBOXTRAY_DND_MESSAGE,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync 0 /* wParm */, (LPARAM)pEvent /* lParm */);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncint VBoxDnDWnd::hide(void)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync#ifdef DEBUG_andy
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LogFlowFunc(("\n"));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync ShowWindow(hWnd, SW_HIDE);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync}
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncint VBoxDnDWnd::makeFullscreen(void)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int rc = VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RECT r;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RT_ZERO(r);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync BOOL fRc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync HDC hDC = GetDC(NULL /* Entire screen */);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (hDC)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync fRc = mpfnEnumDisplayMonitors?
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync mpfnEnumDisplayMonitors(hDC, NULL, VBoxDnDWnd::MonitorEnumProc, (LPARAM)&r):
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync FALSE;
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (!fRc)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_NOT_FOUND;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync ReleaseDC(NULL, hDC);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_ACCESS_DENIED;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (RT_FAILURE(rc))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* If multi-monitor enumeration failed above, try getting at least the
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * primary monitor as a fallback. */
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync r.left = 0;
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync r.top = 0;
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync r.right = GetSystemMetrics(SM_CXSCREEN);
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync r.bottom = GetSystemMetrics(SM_CYSCREEN);
be2d64b9017ca17cf597a73767a1cf928a7e3f7dvboxsync rc = VINF_SUCCESS;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (RT_SUCCESS(rc))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LONG lStyle = GetWindowLong(hWnd, GWL_STYLE);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync SetWindowLong(hWnd, GWL_STYLE,
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync lStyle & ~(WS_CAPTION | WS_THICKFRAME));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync LONG lExStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync SetWindowLong(hWnd, GWL_EXSTYLE,
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync lExStyle & ~( WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync fRc = SetWindowPos(hWnd, HWND_TOPMOST,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync r.left,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync r.top,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync r.right - r.left,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync r.bottom - r.top,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_DND_DEBUG_WND
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync SWP_SHOWWINDOW | SWP_FRAMECHANGED);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync SWP_SHOWWINDOW | SWP_NOOWNERZORDER | SWP_NOREDRAW | SWP_NOACTIVATE);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (fRc)
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFunc(("Virtual screen is %ld,%ld,%ld,%ld (%ld x %ld)\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync r.left, r.top, r.right, r.bottom,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync r.right - r.left, r.bottom - r.top));
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync DWORD dwErr = GetLastError();
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogRel(("DnD: Failed to set proxy window position, rc=%Rrc\n",
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTErrConvertFromWin32(dwErr)));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogRel(("DnD: Failed to determine virtual screen size, rc=%Rrc\n", rc));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFuncLeaveRC(rc);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return rc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync}
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsyncint VBoxDnDWnd::mouseMove(int x, int y, DWORD dwMouseInputFlags)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync{
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int iScreenX = GetSystemMetrics(SM_CXSCREEN) - 1;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int iScreenY = GetSystemMetrics(SM_CYSCREEN) - 1;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync INPUT Input[1] = { 0 };
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input[0].type = INPUT_MOUSE;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input[0].mi.dwFlags = MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync | dwMouseInputFlags;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input[0].mi.dx = x * (65535 / iScreenX);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input[0].mi.dy = y * (65535 / iScreenY);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int rc;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (s_pfnSendInput(1 /* Number of inputs */,
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input, sizeof(INPUT)))
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync#ifdef DEBUG_andy
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync CURSORINFO ci;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync RT_ZERO(ci);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync ci.cbSize = sizeof(ci);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync BOOL fRc = GetCursorInfo(&ci);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (fRc)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync LogFlowThisFunc(("Cursor shown=%RTbool, cursor=0x%p, x=%d, y=%d\n",
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync (ci.flags & CURSOR_SHOWING) ? true : false,
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync ci.hCursor, ci.ptScreenPos.x, ci.ptScreenPos.y));
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync#endif
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = VINF_SUCCESS;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync }
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync else
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync DWORD dwErr = GetLastError();
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = RTErrConvertFromWin32(dwErr);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync LogFlowFunc(("SendInput failed with rc=%Rrc\n", rc));
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync }
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync return rc;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync}
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsyncint VBoxDnDWnd::mouseRelease(void)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync{
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync#ifdef DEBUG_andy
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync LogFlowFunc(("\n"));
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync#endif
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int rc;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync /* Release mouse button in the guest to start the "drop"
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync * action at the current mouse cursor position. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync INPUT Input[1] = { 0 };
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input[0].type = INPUT_MOUSE;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Input[0].mi.dwFlags = MOUSEEVENTF_LEFTUP;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (!s_pfnSendInput(1, Input, sizeof(INPUT)))
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync DWORD dwErr = GetLastError();
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = RTErrConvertFromWin32(dwErr);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync LogFlowFunc(("SendInput failed with rc=%Rrc\n", rc));
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync }
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync else
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = VINF_SUCCESS;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync return rc;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync}
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDWnd::reset(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowThisFunc(("Old mState=%ld\n", mState));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync lstAllowedFormats.clear();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync lstFormats.clear();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uAllActions = DND_IGNORE_ACTION;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mMode = Unknown;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync mState = Initialized;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncstatic LRESULT CALLBACK vboxDnDWndProcInstance(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LONG_PTR pUserData = GetWindowLongPtr(hWnd, GWLP_USERDATA);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pUserData, 0);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBoxDnDWnd *pWnd = reinterpret_cast<VBoxDnDWnd *>(pUserData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pWnd)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return pWnd->WndProc(hWnd, uMsg, wParam, lParam);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncstatic LRESULT CALLBACK vboxDnDWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Note: WM_NCCREATE is not the first ever message which arrives, but
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * early enough for us. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (uMsg == WM_NCCREATE)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LPCREATESTRUCT pCS = (LPCREATESTRUCT)lParam;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pCS);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)pCS->lpCreateParams);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)vboxDnDWndProcInstance);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return vboxDnDWndProcInstance(hWnd, uMsg, wParam, lParam);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* No window associated yet. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return DefWindowProc(hWnd, uMsg, wParam, lParam);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/**
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Initializes drag'n drop.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return IPRT status code.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pEnv The DnD service's environment.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param ppInstance The instance pointer which refer to this object.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pfStartThread Pointer to flag whether the DnD service can be started or not.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pEnv, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** ppInstance not used here. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pfStartThread, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncEnter();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *pfStartThread = false;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVBOXDNDCONTEXT pCtx = &gCtx;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync bool fSupportedOS = true;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync s_pfnSendInput = (PFNSENDINPUT)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync RTLdrGetSystemSymbol("User32.dll", "SendInput");
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync fSupportedOS = !RT_BOOL(s_pfnSendInput == NULL);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (!fSupportedOS)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync LogRel(("DnD: Not supported Windows version, disabling drag'n drop support\n"));
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = VERR_NOT_SUPPORTED;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync else
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = VINF_SUCCESS;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync /* Create the proxy window. At the moment we
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync * only support one window at a time. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync VBoxDnDWnd *pWnd = NULL;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync try
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync pWnd = new VBoxDnDWnd();
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = pWnd->Initialize(pCtx);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync /* Add proxy window to our proxy windows list. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (RT_SUCCESS(rc))
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync pCtx->lstWnd.append(pWnd);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync }
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync catch (std::bad_alloc)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync {
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync rc = VERR_NO_MEMORY;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTSemEventCreate(&pCtx->hEvtQueueSem);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Assign service environment to our context. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync gCtx.pEnv = pEnv;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *ppInstance = pCtx;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *pfStartThread = true;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogRel(("DnD: Drag'n drop service successfully started\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogRel(("DnD: Initializing drag'n drop service failed with rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDStop(const VBOXSERVICEENV *pEnv, void *pInstance)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturnVoid(pEnv);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturnVoid(pInstance);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFunc(("Stopping pInstance=%p\n", pInstance));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVBOXDNDCONTEXT pCtx = (PVBOXDNDCONTEXT)pInstance;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pCtx);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Set shutdown indicator. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ASMAtomicWriteBool(&pCtx->fShutdown, true);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** @todo Notify / wait for HGCM thread! */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDDestroy(const VBOXSERVICEENV *pEnv, void *pInstance)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pEnv);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pInstance);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFunc(("Destroying pInstance=%p\n", pInstance));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVBOXDNDCONTEXT pCtx = (PVBOXDNDCONTEXT)pInstance;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pCtx);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync /** @todo At the moment we only have one DnD proxy window. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync Assert(pCtx->lstWnd.size() == 1);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync VBoxDnDWnd *pWnd = pCtx->lstWnd.first();
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (pWnd)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync delete pWnd;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync if (pCtx->hEvtQueueSem != NIL_RTSEMEVENT)
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync RTSemEventDestroy(pCtx->hEvtQueueSem);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFunc(("Destroyed pInstance=%p, rc=%Rrc\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pInstance, rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncunsigned __stdcall VBoxDnDThread(void *pInstance)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("pInstance=%p\n", pInstance));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVBOXDNDCONTEXT pCtx = (PVBOXDNDCONTEXT)pInstance;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pCtx);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint32_t uClientID;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VbglR3DnDConnect(&uClientID);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /** @todo At the moment we only have one DnD proxy window. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Assert(pCtx->lstWnd.size() == 1);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBoxDnDWnd *pWnd = pCtx->lstWnd.first();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pWnd);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* Number of invalid messages skipped in a row. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int cMsgSkippedInvalid = 0;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync do
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVBOXDNDEVENT pEvent = (PVBOXDNDEVENT)RTMemAlloc(sizeof(VBOXDNDEVENT));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (!pEvent)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NO_MEMORY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Note: pEvent will be free'd by the consumer later. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VbglR3DnDProcessNextMessage(uClientID, &pEvent->Event);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync LogFlowFunc(("VbglR3DnDProcessNextMessage returned uType=%RU32, rc=%Rrc\n",
82391de567696f10b21a762fde6a06fe3c266d28vboxsync pEvent->Event.uType, rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (ASMAtomicReadBool(&pCtx->fShutdown))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync cMsgSkippedInvalid = 0; /* Reset skipped messages count. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Received new event, type=%RU32\n", pEvent->Event.uType));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc2 = pWnd->ProcessEvent(pEvent);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc2))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Processing event failed with rc=%Rrc\n", rc2));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else if (rc == VERR_CANCELLED)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc2 = pWnd->OnHgCancel();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc2))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Cancelling failed with rc=%Rrc\n", rc2));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Processing next message failed with rc=%Rrc\n", rc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* Old(er) hosts either are broken regarding DnD support or otherwise
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * don't support the stuff we do on the guest side, so make sure we
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * don't process invalid messages forever. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (rc == VERR_INVALID_PARAMETER)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync cMsgSkippedInvalid++;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (cMsgSkippedInvalid > 3)
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LogFlowFunc(("Too many invalid/skipped messages from host, exiting ...\n"));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync break;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (ASMAtomicReadBool(&pCtx->fShutdown))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync } while (true);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Shutting down ...\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VbglR3DnDDisconnect(uClientID);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFuncLeaveRC(rc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync