81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* $Id$ */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/** @file
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * VBoxDnD.h - 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
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifndef __VBOXTRAYDND__H
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#define __VBOXTRAYDND__H
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#include <iprt/critsect.h>
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/cpp/mtlist.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/cpp/ministring.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDInit (const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncunsigned __stdcall VBoxDnDThread (void *pInstance);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDStop (const VBOXSERVICEENV *pEnv, void *pInstance);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDDestroy (const VBOXSERVICEENV *pEnv, void *pInstance);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncclass VBoxDnDWnd;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncclass VBoxDnDDataObject : public IDataObject
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync enum Status
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Uninitialized = 0,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Initialized,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Dropping,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Dropped,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Aborted
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync };
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBoxDnDDataObject(FORMATETC *pFormatEtc = NULL, STGMEDIUM *pStgMed = NULL, ULONG cFormats = 0);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync virtual ~VBoxDnDDataObject(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync static int CreateDataObject(FORMATETC *pFormatEtc, STGMEDIUM *pStgMeds,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ULONG cFormats, IDataObject **ppDataObject);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic: /* IUnknown methods. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD_(ULONG, AddRef)(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD_(ULONG, Release)(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic: /* IDataObject methods. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(GetData)(FORMATETC *pFormatEtc, STGMEDIUM *pMedium);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(GetDataHere)(FORMATETC *pFormatEtc, STGMEDIUM *pMedium);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(QueryGetData)(FORMATETC *pFormatEtc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(GetCanonicalFormatEtc)(FORMATETC *pFormatEct, FORMATETC *pFormatEtcOut);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(SetData)(FORMATETC *pFormatEtc, STGMEDIUM *pMedium, BOOL fRelease);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(EnumFormatEtc)(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(DAdvise)(FORMATETC *pFormatEtc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(DUnadvise)(DWORD dwConnection);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(EnumDAdvise)(IEnumSTATDATA **ppEnumAdvise);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync static const char* ClipboardFormatToString(CLIPFORMAT fmt);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int Abort(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync void SetStatus(Status status);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int Signal(const RTCString &strFormat, const void *pvData, uint32_t cbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncprotected:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync bool LookupFormatEtc(FORMATETC *pFormatEtc, ULONG *puIndex);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync static HGLOBAL MemDup(HGLOBAL hMemSource);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync void RegisterFormat(FORMATETC *pFormatEtc, CLIPFORMAT clipFormat, TYMED tyMed = TYMED_HGLOBAL,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LONG lindex = -1, DWORD dwAspect = DVASPECT_CONTENT, DVTARGETDEVICE *pTargetDevice = NULL);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Status mStatus;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LONG mRefCount;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ULONG mcFormats;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync FORMATETC *mpFormatEtc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STGMEDIUM *mpStgMedium;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTSEMEVENT mSemEvent;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCString mstrFormat;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync void *mpvData;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint32_t mcbData;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync};
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncclass VBoxDnDDropSource : public IDropSource
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBoxDnDDropSource(VBoxDnDWnd *pThis);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync virtual ~VBoxDnDDropSource(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint32_t GetCurrentAction(void) { return muCurAction; }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic: /* IUnknown methods. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD_(ULONG, AddRef)(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD_(ULONG, Release)(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic: /* IDropSource methods. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(QueryContinueDrag)(BOOL fEscapePressed, DWORD dwKeyState);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STDMETHOD(GiveFeedback)(DWORD dwEffect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncprotected:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LONG mRefCount;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync VBoxDnDWnd *mpWndParent;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint32_t mClientID;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DWORD mdwCurEffect;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint32_t muCurAction;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync};
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncclass VBoxDnDDropTarget : public IDropTarget
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBoxDnDDropTarget(VBoxDnDWnd *pThis);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync virtual ~VBoxDnDDropTarget(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic: /* IUnknown methods. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync STDMETHOD_(ULONG, AddRef)(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync STDMETHOD_(ULONG, Release)(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic: /* IDropTarget methods. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(DragEnter)(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(DragOver)(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(DragLeave)(void);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(Drop)(IDataObject *pDataObject, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncprotected:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync static DWORD GetDropEffect(DWORD grfKeyState, DWORD dwAllowedEffects);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync void reset(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsyncpublic:
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync void *DataMutableRaw(void) { return mpvData; }
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync uint32_t DataSize(void) { return mcbData; }
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync RTCString Formats(void);
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync int WaitForDrop(RTMSINTERVAL msTimeout);
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncprotected:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LONG mRefCount;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBoxDnDWnd *mpWndParent;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync uint32_t mClientID;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync DWORD mdwCurEffect;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync /** Copy of the data object's FORMATETC struct.
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync * Note: We don't keep the pointer of the
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync * DVTARGETDEVICE here! */
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync FORMATETC mFormatEtc;
00331fbaff118e6a5077fe96327aca51a70459dbvboxsync RTCString mFormats;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync void *mpvData;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync uint32_t mcbData;
a3011b448b38c39a7222f2f1eb40c8349023f650vboxsync RTSEMEVENT hEventDrop;
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int mDroppedRc;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync};
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncclass VBoxDnDEnumFormatEtc : public IEnumFORMATETC
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync VBoxDnDEnumFormatEtc(FORMATETC *pFormatEtc, ULONG cFormats);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync virtual ~VBoxDnDEnumFormatEtc(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD_(ULONG, AddRef)(void);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD_(ULONG, Release)(void);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(Next)(ULONG cFormats, FORMATETC *pFormatEtc, ULONG *pcFetched);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(Skip)(ULONG cFormats);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(Reset)(void);
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync STDMETHOD(Clone)(IEnumFORMATETC ** ppEnumFormatEtc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncpublic:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync static void CopyFormat(FORMATETC *pFormatDest, FORMATETC *pFormatSource);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync static HRESULT CreateEnumFormatEtc(UINT cFormats, FORMATETC *pFormatEtc, IEnumFORMATETC **ppEnumFormatEtc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncprivate:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync LONG m_lRefCount;
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync ULONG m_nIndex;
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync ULONG m_nNumFormats;
b35358a47f67398b71a08eb89e6617493a847f7dvboxsync FORMATETC * m_pFormatEtc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync};
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncstruct VBOXDNDCONTEXT;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncclass VBoxDnDWnd;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync/*
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * A drag'n drop event from the host.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsynctypedef struct VBOXDNDEVENT
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The actual event data. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBGLR3DNDHGCMEVENT Event;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync} VBOXDNDEVENT, *PVBOXDNDEVENT;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync/**
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * DnD context data.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsynctypedef struct VBOXDNDCONTEXT
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Pointer to the service environment. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync const VBOXSERVICEENV *pEnv;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Shutdown indicator. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync bool fShutdown;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The DnD main event queue. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTCMTList<VBOXDNDEVENT> lstEvtQueue;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Semaphore for waiting on main event queue
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * events. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTSEMEVENT hEvtQueueSem;
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync /** List of drag'n drop proxy windows.
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync * Note: At the moment only one window is supported. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTCMTList<VBoxDnDWnd*> lstWnd;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync} VBOXDNDCONTEXT, *PVBOXDNDCONTEXT;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncstatic VBOXDNDCONTEXT gCtx = {0};
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync/**
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * Everything which is required to successfully start
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * a drag'n drop operation via DoDragDrop().
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsynctypedef struct VBOXDNDSTARTUPINFO
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Our DnD data object, holding
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * the raw DnD data. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBoxDnDDataObject *pDataObject;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The drop source for sending the
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * DnD request to a IDropTarget. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBoxDnDDropSource *pDropSource;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The DnD effects which are wanted / allowed. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync DWORD dwOKEffects;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync} VBOXDNDSTARTUPINFO, *PVBOXDNDSTARTUPINFO;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync/**
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * Class for handling a DnD proxy window.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync ** @todo Unify this and VBoxClient's DragInstance!
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncclass VBoxDnDWnd
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync{
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /**
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * Current state of a DnD proxy
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * window.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync enum State
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Uninitialized = 0,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Initialized,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Dragging,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Dropped,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Canceled
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync };
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /**
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * Current operation mode of
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * a DnD proxy window.
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync enum Mode
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync {
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Unknown mode. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Unknown = 0,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Host to guest. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync HG,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Guest to host. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync };
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBoxDnDWnd(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync virtual ~VBoxDnDWnd(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int Initialize(PVBOXDNDCONTEXT pContext);
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync void Destroy(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The window's thread for the native message pump and
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * OLE context. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync static int Thread(RTTHREAD hThread, void *pvUser);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync static BOOL CALLBACK MonitorEnumProc(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, LPARAM lParam);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The per-instance wndproc routine. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int RegisterAsDropTarget(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int UnregisterAsDropTarget(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnCreate(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync void OnDestroy(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* H->G */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnHgEnter(const RTCList<RTCString> &formats, uint32_t uAllActions);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnHgMove(uint32_t u32xPos, uint32_t u32yPos, uint32_t uAllActions);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnHgDrop(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnHgLeave(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnHgDataReceived(const void *pvData, uint32_t cData);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnHgCancel(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef VBOX_WITH_DRAG_AND_DROP_GH
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /* G->H */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int OnGhIsDnDPending(uint32_t uScreenID);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int OnGhDropped(const char *pszFormat, uint32_t cbFormats, uint32_t uDefAction);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int ProcessEvent(PVBOXDNDEVENT pEvent);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int hide(void);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncprotected:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync int makeFullscreen(void);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int mouseMove(int x, int y, DWORD dwMouseInputFlags);
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync int mouseRelease(void);
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync void reset(void);
2ad9f8a731c73f6ac74044d42d47bbaf6f44a566vboxsync int setMode(Mode enmMode);
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsyncpublic: /** @todo Make protected! */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Pointer to DnD context. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync PVBOXDNDCONTEXT pContext;
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync /** The proxy window's main thread for processing
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync * window messages. */
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync RTTHREAD hThread;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTCRITSECT mCritSect;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTSEMEVENT mEventSem;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#ifdef RT_OS_WINDOWS
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The window's handle. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync HWND hWnd;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** List of allowed MIME types this
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * client can handle. Make this a per-instance
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * property so that we can selectively allow/forbid
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * certain types later on runtime. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTCList<RTCString> lstAllowedFormats;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** List of formats for the current
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * drag'n drop operation. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTCList<RTCString> lstFormats;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Flags of all current drag'n drop
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * actions allowed. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync uint32_t uAllActions;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The startup information required
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * for the actual DoDragDrop() call. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync VBOXDNDSTARTUPINFO startupInfo;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** Is the left mouse button being pressed
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync * currently while being in this window? */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync bool mfMouseButtonDown;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync# ifdef VBOX_WITH_DRAG_AND_DROP_GH
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync /** IDropTarget implementation for guest -> host
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync * support. */
440c59bb6f5f678ce4e2569847262f6350c80fabvboxsync VBoxDnDDropTarget *pDropTarget;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync# endif /* VBOX_WITH_DRAG_AND_DROP_GH */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync#else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** @todo Implement me. */
e6d5e53bf42a48e3363ce7075cac0cdf83f956b5vboxsync#endif /* RT_OS_WINDOWS */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The window's own HGCM client ID. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync uint32_t mClientID;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The current operation mode. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync Mode mMode;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync /** The current state. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync State mState;
fdca3f8441b2cfdf10d1c78011986554948a7753vboxsync /** Format being requested. */
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync RTCString mFormatRequested;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync};
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif /* __VBOXTRAYDND__H */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync