81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* $Id$ */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/** @file
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * VBoxDnDDataObject.cpp - IDataObject implementation.
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 <new> /* For bad_alloc. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <shlobj.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/path.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/semaphore.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include <iprt/uri.h>
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
a29027bb2378172c7c88610ad5311548b66f96f6vboxsync#ifdef LOG_GROUP
a29027bb2378172c7c88610ad5311548b66f96f6vboxsync# undef LOG_GROUP
a29027bb2378172c7c88610ad5311548b66f96f6vboxsync#endif
a29027bb2378172c7c88610ad5311548b66f96f6vboxsync#define LOG_GROUP LOG_GROUP_GUEST_DND
a29027bb2378172c7c88610ad5311548b66f96f6vboxsync#include <VBox/log.h>
a29027bb2378172c7c88610ad5311548b66f96f6vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBoxTray.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBoxHelpers.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#include "VBoxDnD.h"
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#ifdef DEBUG
069b9101fbd3b049610c5511b1cc9534d01ea472vboxsync /* Enable the following line to get much more debug output about
069b9101fbd3b049610c5511b1cc9534d01ea472vboxsync * (un)known clipboard formats. */
069b9101fbd3b049610c5511b1cc9534d01ea472vboxsync//# define VBOX_DND_DEBUG_FORMATS
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
82391de567696f10b21a762fde6a06fe3c266d28vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/** @todo Implement IDataObjectAsyncCapability interface? */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncVBoxDnDDataObject::VBoxDnDDataObject(FORMATETC *pFormatEtc,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STGMEDIUM *pStgMed, ULONG cFormats)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync : mStatus(Uninitialized),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mRefCount(1),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mcFormats(0),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpvData(NULL),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mcbData(0)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync HRESULT hr;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Make sure that there's enough room for our fixed formats. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ULONG cAllFormats = cFormats + 1;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync try
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpFormatEtc = new FORMATETC[cAllFormats];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RT_BZERO(mpFormatEtc, sizeof(FORMATETC) * cAllFormats);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpStgMedium = new STGMEDIUM[cAllFormats];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RT_BZERO(mpStgMedium, sizeof(STGMEDIUM) * cAllFormats);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if ( pFormatEtc
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && pStgMed)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (ULONG i = 0; i < cFormats; i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Format %RU32: cfFormat=%RI16, tyMed=%RU32, dwAspect=%RU32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync i, pFormatEtc[i].cfFormat, pFormatEtc[i].tymed, pFormatEtc[i].dwAspect));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpFormatEtc[i] = pFormatEtc[i];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpStgMedium[i] = pStgMed[i];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hr = S_OK;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync catch (std::bad_alloc &)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hr = E_OUTOFMEMORY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (SUCCEEDED(hr))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc2 = RTSemEventCreate(&mSemEvent);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertRC(rc2);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Most commonly used format. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats], CF_HDROP);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpStgMedium[cFormats++].tymed = TYMED_HGLOBAL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#if 0
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* IStream. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats++],
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterClipboardFormat(CFSTR_FILEDESCRIPTOR));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats++],
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterClipboardFormat(CFSTR_FILECONTENTS),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync TYMED_ISTREAM, 0 /* lIndex */);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Required for e.g. Windows Media Player. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats++],
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterClipboardFormat(CFSTR_FILENAME));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats++],
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterClipboardFormat(CFSTR_FILENAMEW));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats++],
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterClipboardFormat(CFSTR_SHELLIDLIST));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterFormat(&mpFormatEtc[cFormats++],
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RegisterClipboardFormat(CFSTR_SHELLIDLISTOFFSET));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mcFormats = cFormats;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mStatus = Initialized;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("cFormats=%RU32, hr=%Rhrc\n", cFormats, hr));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncVBoxDnDDataObject::~VBoxDnDDataObject(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mpFormatEtc)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync delete[] mpFormatEtc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mpStgMedium)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync delete[] mpStgMedium;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mpvData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTMemFree(mpvData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("mRefCount=%RI32\n", mRefCount));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* static */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDDataObject::CreateDataObject(FORMATETC *pFormatEtc, STGMEDIUM *pStgMeds,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ULONG cFormats, IDataObject **ppDataObject)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pFormatEtc, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pStgMeds, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(ppDataObject, VERR_INVALID_POINTER);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync try
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *ppDataObject = new VBoxDnDDataObject(pFormatEtc, pStgMeds, cFormats);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync catch(std::bad_alloc &)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NO_MEMORY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/*
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * IUnknown methods.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP_(ULONG) VBoxDnDDataObject::AddRef(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return InterlockedIncrement(&mRefCount);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP_(ULONG) VBoxDnDDataObject::Release(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LONG lCount = InterlockedDecrement(&mRefCount);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (lCount == 0)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync delete this;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return lCount;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::QueryInterface(REFIID iid, void **ppvObject)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(ppvObject, E_INVALIDARG);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if ( iid == IID_IDataObject
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync || iid == IID_IUnknown)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AddRef();
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *ppvObject = this;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return S_OK;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *ppvObject = 0;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return E_NOINTERFACE;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/**
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Retrieves the data stored in this object and store the result in
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * pMedium.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return IPRT status code.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return HRESULT
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pFormatEtc
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pMedium
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::GetData(FORMATETC *pFormatEtc, STGMEDIUM *pMedium)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pFormatEtc, DV_E_FORMATETC);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtrReturn(pMedium, DV_E_FORMATETC);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync ULONG lIndex;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (!LookupFormatEtc(pFormatEtc, &lIndex)) /* Format supported? */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return DV_E_FORMATETC;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (lIndex >= mcFormats) /* Paranoia. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return DV_E_FORMATETC;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync FORMATETC *pThisFormat = &mpFormatEtc[lIndex];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pThisFormat);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync STGMEDIUM *pThisMedium = &mpStgMedium[lIndex];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pThisMedium);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
069b9101fbd3b049610c5511b1cc9534d01ea472vboxsync LogFlowFunc(("Using pThisFormat=%p, pThisMedium=%p\n", pThisFormat, pThisMedium));
069b9101fbd3b049610c5511b1cc9534d01ea472vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync HRESULT hr = DV_E_FORMATETC;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("mStatus=%ld\n", mStatus));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mStatus == Dropping)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Waiting for event ...\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc2 = RTSemEventWait(mSemEvent, RT_INDEFINITE_WAIT);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("rc=%Rrc, mStatus=%ld\n", rc2, mStatus));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mStatus == Dropped)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("cfFormat=%RI16, sFormat=%s, tyMed=%RU32, dwAspect=%RU32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pThisFormat->cfFormat, VBoxDnDDataObject::ClipboardFormatToString(pFormatEtc->cfFormat),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pThisFormat->tymed, pThisFormat->dwAspect));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Got strFormat=%s, pvData=%p, cbData=%RU32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mstrFormat.c_str(), mpvData, mcbData));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mstrFormat.equalsIgnoreCase("text/uri-list"))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCList<RTCString> lstFilesURI = RTCString((char*)mpvData, mcbData).split("\r\n");
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTCList<RTCString> lstFiles;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (size_t i = 0; i < lstFilesURI.size(); i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Extract path from URI. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync char *pszPath = RTUriPath(lstFilesURI.at(i).c_str());
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if ( pszPath
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && strlen(pszPath) > 1)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pszPath++; /** @todo Skip first '/' (part of URI). Correct? */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pszPath = RTPathChangeToDosSlashes(pszPath, false /* fForce */);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync lstFiles.append(pszPath);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#ifdef DEBUG
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Files (%zu)\n", lstFiles.size()));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (size_t i = 0; i < lstFiles.size(); i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("\tFile: %s\n", lstFiles.at(i).c_str()));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#if 0
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if ( (pFormatEtc->tymed & TYMED_ISTREAM)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->dwAspect == DVASPECT_CONTENT)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->cfFormat == CF_FILECONTENTS))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else if ( (pFormatEtc->tymed & TYMED_HGLOBAL)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->dwAspect == DVASPECT_CONTENT)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->cfFormat == CF_FILEDESCRIPTOR))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else if ( (pFormatEtc->tymed & TYMED_HGLOBAL)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->cfFormat == CF_PREFERREDDROPEFFECT))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync HGLOBAL hData = GlobalAlloc(GMEM_MOVEABLE | GMEM_SHARE | GMEM_ZEROINIT, sizeof(DWORD));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DWORD *pdwEffect = (DWORD *)GlobalLock(hData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pdwEffect);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *pdwEffect = DROPEFFECT_COPY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync GlobalUnlock(hData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->hGlobal = hData;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->tymed = TYMED_HGLOBAL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if ( (pFormatEtc->tymed & TYMED_HGLOBAL)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->dwAspect == DVASPECT_CONTENT)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->cfFormat == CF_TEXT))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->hGlobal = GlobalAlloc(GHND, mcbData + 1);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pMedium->hGlobal)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync char *pcDst = (char *)GlobalLock(pMedium->hGlobal);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync memcpy(pcDst, mpvData, mcbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pcDst[mcbData] = '\0';
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync GlobalUnlock(pMedium->hGlobal);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hr = S_OK;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else if ( (pFormatEtc->tymed & TYMED_HGLOBAL)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->dwAspect == DVASPECT_CONTENT)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && (pFormatEtc->cfFormat == CF_HDROP))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync size_t cchFiles = 0; /* Number of ASCII characters. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (size_t i = 0; i < lstFiles.size(); i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync cchFiles += strlen(lstFiles.at(i).c_str());
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync cchFiles += 1; /* Terminating '\0'. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync size_t cbBuf = sizeof(DROPFILES) + ((cchFiles + 1) * sizeof(RTUTF16));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DROPFILES *pBuf = (DROPFILES *)RTMemAllocZ(cbBuf);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pBuf)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pBuf->pFiles = sizeof(DROPFILES);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pBuf->fWide = 1; /* We use unicode. Always. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync uint8_t *pCurFile = (uint8_t *)pBuf + pBuf->pFiles;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pCurFile);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (size_t i = 0; i < lstFiles.size() && RT_SUCCESS(rc); i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync size_t cchCurFile;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PRTUTF16 pwszFile;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = RTStrToUtf16(lstFiles.at(i).c_str(), &pwszFile);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync cchCurFile = RTUtf16Len(pwszFile);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync Assert(cchCurFile);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync memcpy(pCurFile, pwszFile, cchCurFile * sizeof(RTUTF16));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTUtf16Free(pwszFile);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pCurFile += cchCurFile * sizeof(RTUTF16);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Terminate current file name. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *pCurFile = L'\0';
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pCurFile += sizeof(RTUTF16);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *pCurFile = L'\0'; /* Final list terminator. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->tymed = TYMED_HGLOBAL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->pUnkForRelease = NULL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->hGlobal = GlobalAlloc( GMEM_ZEROINIT
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync | GMEM_MOVEABLE
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync | GMEM_DDESHARE, cbBuf);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pMedium->hGlobal)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LPVOID pMem = GlobalLock(pMedium->hGlobal);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pMem)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync memcpy(pMem, pBuf, cbBuf);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync GlobalUnlock(pMedium->hGlobal);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hr = S_OK;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync RTMemFree(pBuf);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync else
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync rc = VERR_NO_MEMORY;
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync if (RT_FAILURE(rc))
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync hr = DV_E_FORMATETC;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (FAILED(hr))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Copying medium ...\n"));
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync switch (pThisMedium->tymed)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case TYMED_HGLOBAL:
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pMedium->hGlobal = (HGLOBAL)OleDuplicateData(pThisMedium->hGlobal,
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pThisFormat->cfFormat, NULL);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync default:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync pMedium->tymed = pThisFormat->tymed;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pMedium->pUnkForRelease = NULL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("hr=%Rhrc\n", hr));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return hr;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/**
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Only required for IStream / IStorage interfaces.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return IPRT status code.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return HRESULT
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pFormatEtc
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pMedium
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::GetDataHere(FORMATETC *pFormatEtc, STGMEDIUM *pMedium)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return DATA_E_FORMATETC;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/**
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Query if this objects supports a specific format.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return IPRT status code.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @return HRESULT
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * @param pFormatEtc
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::QueryGetData(FORMATETC *pFormatEtc)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return (LookupFormatEtc(pFormatEtc, NULL /* puIndex */)) ? S_OK : DV_E_FORMATETC;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::GetCanonicalFormatEtc(FORMATETC *pFormatEct, FORMATETC *pFormatEtcOut)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Set this to NULL in any case. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtcOut->ptd = NULL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return E_NOTIMPL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::SetData(FORMATETC *pFormatEtc, STGMEDIUM *pMedium, BOOL fRelease)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return E_NOTIMPL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("dwDirection=%RI32, mcFormats=%RI32, mpFormatEtc=%p\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync dwDirection, mcFormats, mpFormatEtc));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync HRESULT hr;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (dwDirection == DATADIR_GET)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hr = VBoxDnDEnumFormatEtc::CreateEnumFormatEtc(mcFormats, mpFormatEtc, ppEnumFormatEtc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync hr = E_NOTIMPL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("hr=%Rhrc\n", hr));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return hr;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::DAdvise(FORMATETC *pFormatEtc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return OLE_E_ADVISENOTSUPPORTED;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::DUnadvise(DWORD dwConnection)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return OLE_E_ADVISENOTSUPPORTED;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncSTDMETHODIMP VBoxDnDDataObject::EnumDAdvise(IEnumSTATDATA **ppEnumAdvise)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return OLE_E_ADVISENOTSUPPORTED;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/*
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync * Own stuff.
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDDataObject::Abort(void)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Aborting ...\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mStatus = Aborted;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return RTSemEventSignal(mSemEvent);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* static */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncconst char* VBoxDnDDataObject::ClipboardFormatToString(CLIPFORMAT fmt)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
069b9101fbd3b049610c5511b1cc9534d01ea472vboxsync#if 0
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync char szFormat[128];
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (GetClipboardFormatName(fmt, szFormat, sizeof(szFormat)))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("wFormat=%RI16, szName=%s\n", fmt, szFormat));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync switch (fmt)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 1:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_TEXT";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 2:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_BITMAP";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 3:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_METAFILEPICT";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 4:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_SYLK";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 5:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_DIF";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 6:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_TIFF";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 7:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_OEMTEXT";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 8:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_DIB";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 9:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_PALETTE";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 10:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_PENDATA";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 11:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_RIFF";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 12:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_WAVE";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 13:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_UNICODETEXT";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 14:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_ENHMETAFILE";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 15:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_HDROP";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 16:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_LOCALE";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 17:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_DIBV5";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 18:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "CF_MAX";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49158:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "FileName";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49159:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "FileNameW";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49161:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "DATAOBJECT";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49171:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "Ole Private Data";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49314:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "Shell Object Offsets";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49316:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "File Contents";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49317:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "File Group Descriptor";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49323:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "Preferred Drop Effect";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49380:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "Shell Object Offsets";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49382:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "FileContents";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49383:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "FileGroupDescriptor";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49389:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "Preferred DropEffect";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49268:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "Shell IDList Array";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync case 49619:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "RenPrivateFileAttachments";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync default:
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync break;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return "unknown";
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncbool VBoxDnDDataObject::LookupFormatEtc(FORMATETC *pFormatEtc, ULONG *puIndex)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertReturn(pFormatEtc, false);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* puIndex is optional. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync for (ULONG i = 0; i < mcFormats; i++)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if( (pFormatEtc->tymed & mpFormatEtc[i].tymed)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && pFormatEtc->cfFormat == mpFormatEtc[i].cfFormat
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync && pFormatEtc->dwAspect == mpFormatEtc[i].dwAspect)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Format found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32, ulIndex=%RU32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->tymed, pFormatEtc->cfFormat, VBoxDnDDataObject::ClipboardFormatToString(mpFormatEtc[i].cfFormat),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->dwAspect, i));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (puIndex)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync *puIndex = i;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return true;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#ifdef VBOX_DND_DEBUG_FORMATS
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Format NOT found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->tymed, pFormatEtc->cfFormat, VBoxDnDDataObject::ClipboardFormatToString(pFormatEtc->cfFormat),
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->dwAspect));
82391de567696f10b21a762fde6a06fe3c266d28vboxsync#endif
b8e7a8042499abf6f2551c545f6141b36868ab4dvboxsync return false;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync/* static */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncHGLOBAL VBoxDnDDataObject::MemDup(HGLOBAL hMemSource)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DWORD dwLen = GlobalSize(hMemSource);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertReturn(dwLen, NULL);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVOID pvSource = GlobalLock(hMemSource);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pvSource)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync PVOID pvDest = GlobalAlloc(GMEM_FIXED, dwLen);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (pvDest)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync memcpy(pvDest, pvSource, dwLen);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync GlobalUnlock(hMemSource);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return pvDest;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return NULL;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDDataObject::RegisterFormat(FORMATETC *pFormatEtc, CLIPFORMAT clipFormat,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync TYMED tyMed, LONG lIndex, DWORD dwAspect,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync DVTARGETDEVICE *pTargetDevice)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync AssertPtr(pFormatEtc);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->cfFormat = clipFormat;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->tymed = tyMed;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->lindex = lIndex;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->dwAspect = dwAspect;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->ptd = pTargetDevice;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Registered format=%ld, sFormat=%s\n",
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync pFormatEtc->cfFormat, VBoxDnDDataObject::ClipboardFormatToString(pFormatEtc->cfFormat)));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncvoid VBoxDnDDataObject::SetStatus(Status status)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Setting status to %ld\n", status));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mStatus = status;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsyncint VBoxDnDDataObject::Signal(const RTCString &strFormat,
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync const void *pvData, uint32_t cbData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync{
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync LogFlowFunc(("Signalling ...\n"));
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mStatus = Dropped;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mstrFormat = strFormat;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (cbData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mpvData = RTMemAlloc(cbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (mpvData)
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync {
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync memcpy(mpvData, pvData, cbData);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mcbData = cbData;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VERR_NO_MEMORY;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync }
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync else
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = VINF_SUCCESS;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_FAILURE(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync mStatus = Aborted;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync /* Signal in any case. */
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync int rc2 = RTSemEventSignal(mSemEvent);
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync if (RT_SUCCESS(rc))
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync rc = rc2;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync return rc;
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync}
81f46059436c6145937a4cc2c7424023a289fcd8vboxsync