2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/** @file
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * Drag and Drop manager.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/*
82391de567696f10b21a762fde6a06fe3c266d28vboxsync * Copyright (C) 2011-2014 Oracle Corporation
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync *
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * available from http://www.virtualbox.org. This file is free software;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * you can redistribute it and/or modify it under the terms of the GNU
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * General Public License (GPL) as published by the Free Software
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#ifndef ___VBox_HostService_DnD_dndmanager_h
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#define ___VBox_HostService_DnD_dndmanager_h
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#include <VBox/GuestHost/DragAndDrop.h>
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#include <VBox/HostServices/Service.h>
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#include <VBox/HostServices/DragAndDropSvc.h>
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#include <iprt/cpp/ministring.h>
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#include <iprt/cpp/list.h>
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
99f33ab590a3a65e0cd082dd8d67779efb9cc6c9vboxsynctypedef DECLCALLBACK(int) FNDNDPROGRESS(unsigned uPercentage, uint32_t uState, int rc, void *pvUser);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsynctypedef FNDNDPROGRESS *PFNDNDPROGRESS;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/**
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * DnD message class. This class forms the base of all other more specialized
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * message classes.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncclass DnDMessage
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync{
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncpublic:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync DnDMessage(void)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync : m_pNextMsg(NULL)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync virtual ~DnDMessage(void)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync clearNextMsg();
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync virtual HGCM::Message* nextHGCMMessage(void)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync return m_pNextMsg;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync virtual int currentMessageInfo(uint32_t *puMsg, uint32_t *pcParms)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync AssertPtrReturn(puMsg, VERR_INVALID_POINTER);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync AssertPtrReturn(pcParms, VERR_INVALID_POINTER);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync if (!m_pNextMsg)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync return VERR_NO_DATA;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync *puMsg = m_pNextMsg->message();
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync *pcParms = m_pNextMsg->paramsCount();
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync return VINF_SUCCESS;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync virtual int currentMessage(uint32_t uMsg, uint32_t cParms,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync VBOXHGCMSVCPARM paParms[])
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync if (!m_pNextMsg)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync return VERR_NO_DATA;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync int rc = m_pNextMsg->getData(uMsg, cParms, paParms);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync clearNextMsg();
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync return rc;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync virtual void clearNextMsg(void)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync if (m_pNextMsg)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync delete m_pNextMsg;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync m_pNextMsg = NULL;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync virtual bool isMessageWaiting(void) const { return m_pNextMsg != NULL; }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncprotected:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync HGCM::Message *m_pNextMsg;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync};
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/**
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * DnD message class for generic messages which didn't need any special
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * handling.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncclass DnDGenericMessage: public DnDMessage
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync{
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncpublic:
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync DnDGenericMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[])
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync m_pNextMsg = new HGCM::Message(uMsg, cParms, paParms);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync};
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/**
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * DnD message class for informing the guest about a new drop data event.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncclass DnDHGSendDataMessage: public DnDMessage
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync{
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncpublic:
6aa04d8e8d3a39ca628c07d7f800cd681cf2c40fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync DnDHGSendDataMessage(uint32_t uMsg, uint32_t cParms,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync VBOXHGCMSVCPARM paParms[],
82391de567696f10b21a762fde6a06fe3c266d28vboxsync PFNDNDPROGRESS pfnProgressCallback, void *pvProgressUser);
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
6aa04d8e8d3a39ca628c07d7f800cd681cf2c40fvboxsync virtual ~DnDHGSendDataMessage(void);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
6aa04d8e8d3a39ca628c07d7f800cd681cf2c40fvboxsync HGCM::Message* nextHGCMMessage(void);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync int currentMessageInfo(uint32_t *puMsg, uint32_t *pcParms);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync int currentMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
6aa04d8e8d3a39ca628c07d7f800cd681cf2c40fvboxsync bool isMessageWaiting(void) const { return !!m_pNextPathMsg; }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncprotected:
6aa04d8e8d3a39ca628c07d7f800cd681cf2c40fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync static DECLCALLBACK(int) progressCallback(size_t cbDone, void *pvUser);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync DnDMessage *m_pNextPathMsg;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync DnDURIList m_lstURI;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* Total message size (in bytes). */
82391de567696f10b21a762fde6a06fe3c266d28vboxsync size_t m_cbTotal;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync /* Transferred message size (in bytes). */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync size_t m_cbTransfered;
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync PFNDNDPROGRESS m_pfnProgressCallback;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync void *m_pvProgressUser;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync};
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/**
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * DnD message class for informing the guest to cancel any currently and
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * pending activities.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncclass DnDHGCancelMessage: public DnDMessage
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync{
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncpublic:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync DnDHGCancelMessage(void)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
82391de567696f10b21a762fde6a06fe3c266d28vboxsync m_pNextMsg
82391de567696f10b21a762fde6a06fe3c266d28vboxsync = new HGCM::Message(DragAndDropSvc::HOST_DND_HG_EVT_CANCEL,
82391de567696f10b21a762fde6a06fe3c266d28vboxsync 0 /* cParms */, 0 /* aParms */);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync};
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync/**
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * DnD manager. Manage creation and queuing of messages for the various DnD
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync * messages types.
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncclass DnDManager
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync{
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncpublic:
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync DnDManager(PFNDNDPROGRESS pfnProgressCallback, void *pvProgressUser)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync : m_pCurMsg(0)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync , m_fOpInProcess(false)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync , m_pfnProgressCallback(pfnProgressCallback)
82391de567696f10b21a762fde6a06fe3c266d28vboxsync , m_pvProgressUser(pvProgressUser)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {}
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync virtual ~DnDManager(void)
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync {
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync clear();
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync int addMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync HGCM::Message *nextHGCMMessage(void);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync int nextMessageInfo(uint32_t *puMsg, uint32_t *pcParms);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync int nextMessage(uint32_t uMsg, uint32_t cParms, VBOXHGCMSVCPARM paParms[]);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync void clear(void);
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync bool hasActiveOperation(void) const { return m_fOpInProcess; }
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsyncprivate:
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync DnDMessage *m_pCurMsg;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync RTCList<DnDMessage*> m_dndMessageQueue;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync bool m_fOpInProcess;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync /* Progress stuff */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync PFNDNDPROGRESS m_pfnProgressCallback;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync void *m_pvProgressUser;
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync};
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync#endif /* ___VBox_HostService_DnD_dndmanager_h */
2a171646d32f8a15e9820d6fb3bf3f9b9990ca3fvboxsync