VirtualBox

Ignore:
Timestamp:
May 24, 2019 1:15:59 PM (6 years ago)
Author:
vboxsync
Message:

Shared Clipboard/URI: Update.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/GuestHost/SharedClipboard/ClipboardDataObjectImpl-win.cpp

    r78476 r78725  
    4242#include <VBox/log.h>
    4343
    44 VBoxClipboardWinDataObject::VBoxClipboardWinDataObject(LPFORMATETC pFormatEtc, LPSTGMEDIUM pStgMed, ULONG cFormats)
    45     : mStatus(Uninitialized)
    46     , mRefCount(0)
    47     , mcFormats(0)
    48     , muClientID(0)
    49 {
     44VBoxClipboardWinDataObject::VBoxClipboardWinDataObject(SharedClipboardProvider *pProvider,
     45                                                       LPFORMATETC pFormatEtc, LPSTGMEDIUM pStgMed, ULONG cFormats)
     46    : m_enmStatus(Uninitialized)
     47    , m_lRefCount(0)
     48    , m_cFormats(0)
     49    , m_pProvider(pProvider)
     50{
     51    AssertPtr(pProvider);
     52
    5053    HRESULT hr;
    5154
     
    5558    try
    5659    {
    57         mpFormatEtc = new FORMATETC[cAllFormats];
    58         RT_BZERO(mpFormatEtc, sizeof(FORMATETC) * cAllFormats);
    59         mpStgMedium = new STGMEDIUM[cAllFormats];
    60         RT_BZERO(mpStgMedium, sizeof(STGMEDIUM) * cAllFormats);
     60        m_pFormatEtc = new FORMATETC[cAllFormats];
     61        RT_BZERO(m_pFormatEtc, sizeof(FORMATETC) * cAllFormats);
     62        m_pStgMedium = new STGMEDIUM[cAllFormats];
     63        RT_BZERO(m_pStgMedium, sizeof(STGMEDIUM) * cAllFormats);
    6164
    6265        /** @todo Do we need CFSTR_FILENAME / CFSTR_SHELLIDLIST here? */
     
    6770
    6871        /* IStream interface, implemented in ClipboardStreamImpl-win.cpp. */
    69         registerFormat(&mpFormatEtc[FormatIndex_FileDescriptorA],
     72        registerFormat(&m_pFormatEtc[FormatIndex_FileDescriptorA],
    7073                       RegisterClipboardFormat(CFSTR_FILEDESCRIPTORA));
    71         registerFormat(&mpFormatEtc[FormatIndex_FileDescriptorW],
     74        registerFormat(&m_pFormatEtc[FormatIndex_FileDescriptorW],
    7275                       RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW));
    73         registerFormat(&mpFormatEtc[FormatIndex_FileContents],
     76        registerFormat(&m_pFormatEtc[FormatIndex_FileContents],
    7477                       RegisterClipboardFormat(CFSTR_FILECONTENTS),
    7578                       TYMED_ISTREAM, 0 /* lIndex */);
     
    8891                LogFlowFunc(("Format %RU32: cfFormat=%RI16, tyMed=%RU32, dwAspect=%RU32\n",
    8992                             i, pFormatEtc[i].cfFormat, pFormatEtc[i].tymed, pFormatEtc[i].dwAspect));
    90                 mpFormatEtc[cFixedFormats + i] = pFormatEtc[i];
    91                 mpStgMedium[cFixedFormats + i] = pStgMed[i];
     93                m_pFormatEtc[cFixedFormats + i] = pFormatEtc[i];
     94                m_pStgMedium[cFixedFormats + i] = pStgMed[i];
    9295            }
    9396        }
     
    102105    if (SUCCEEDED(hr))
    103106    {
    104         mcFormats = cAllFormats;
    105         mStatus   = Initialized;
     107        m_cFormats  = cAllFormats;
     108        m_enmStatus = Initialized;
     109
     110        m_pProvider->AddRef();
    106111    }
    107112
     
    111116VBoxClipboardWinDataObject::~VBoxClipboardWinDataObject(void)
    112117{
    113     if (mpStream)
    114         mpStream->Release();
    115 
    116     if (mpFormatEtc)
    117         delete[] mpFormatEtc;
    118 
    119     if (mpStgMedium)
    120         delete[] mpStgMedium;
    121 
    122     LogFlowFunc(("mRefCount=%RI32\n", mRefCount));
     118    if (m_pProvider)
     119        m_pProvider->Release();
     120
     121    if (m_pStream)
     122        m_pStream->Release();
     123
     124    if (m_pFormatEtc)
     125        delete[] m_pFormatEtc;
     126
     127    if (m_pStgMedium)
     128        delete[] m_pStgMedium;
     129
     130    LogFlowFunc(("mRefCount=%RI32\n", m_lRefCount));
    123131}
    124132
     
    129137STDMETHODIMP_(ULONG) VBoxClipboardWinDataObject::AddRef(void)
    130138{
    131     LONG lCount = InterlockedIncrement(&mRefCount);
     139    LONG lCount = InterlockedIncrement(&m_lRefCount);
    132140    LogFlowFunc(("lCount=%RI32\n", lCount));
    133141    return lCount;
     
    136144STDMETHODIMP_(ULONG) VBoxClipboardWinDataObject::Release(void)
    137145{
    138     LONG lCount = InterlockedDecrement(&mRefCount);
    139     LogFlowFunc(("lCount=%RI32\n", mRefCount));
     146    LONG lCount = InterlockedDecrement(&m_lRefCount);
     147    LogFlowFunc(("lCount=%RI32\n", m_lRefCount));
    140148    if (lCount == 0)
    141149    {
     
    186194}
    187195
    188 int VBoxClipboardWinDataObject::createFileGroupDescriptor(const SharedClipboardURIList &URIList, HGLOBAL *phGlobal)
     196int VBoxClipboardWinDataObject::createFileGroupDescriptor(const SharedClipboardURIList &URIList,
     197                                                          bool fUnicode, HGLOBAL *phGlobal)
    189198{
    190199//    AssertReturn(URIList.GetRootCount(), VERR_INVALID_PARAMETER);
    191200    AssertPtrReturn(phGlobal, VERR_INVALID_POINTER);
     201
     202    RT_NOREF(fUnicode);
    192203
    193204    int rc;
     
    275286    if (!lookupFormatEtc(pFormatEtc, &lIndex)) /* Format supported? */
    276287        return DV_E_FORMATETC;
    277     if (lIndex >= mcFormats) /* Paranoia. */
     288    if (lIndex >= m_cFormats) /* Paranoia. */
    278289        return DV_E_LINDEX;
    279290
    280     LPFORMATETC pThisFormat = &mpFormatEtc[lIndex];
     291    LPFORMATETC pThisFormat = &m_pFormatEtc[lIndex];
    281292    AssertPtr(pThisFormat);
    282293
    283     LPSTGMEDIUM pThisMedium = &mpStgMedium[lIndex];
     294    LPSTGMEDIUM pThisMedium = &m_pStgMedium[lIndex];
    284295    AssertPtr(pThisMedium);
    285296
     
    288299    HRESULT hr = DV_E_FORMATETC; /* Play safe. */
    289300
    290     LogRel3(("Clipboard: cfFormat=%RI16, sFormat=%s, tyMed=%RU32, dwAspect=%RU32 -> lIndex=%u\n",
     301    LogRel2(("Clipboard: cfFormat=%RI16, sFormat=%s, tyMed=%RU32, dwAspect=%RU32 -> lIndex=%u\n",
    291302             pThisFormat->cfFormat, VBoxClipboardWinDataObject::ClipboardFormatToString(pFormatEtc->cfFormat),
    292303             pThisFormat->tymed, pThisFormat->dwAspect, lIndex));
     
    300311    switch (lIndex)
    301312    {
    302         case FormatIndex_FileDescriptorA:
     313        case FormatIndex_FileDescriptorA: /* ANSI */
     314        case FormatIndex_FileDescriptorW: /* Unicode */
    303315        {
    304             LogFlowFunc(("FormatIndex_FileDescriptorA\n"));
    305 
    306             SharedClipboardURIList mURIList;
    307            // mURIList.AppendURIPath()
    308 
    309             HGLOBAL hGlobal;
    310             int rc = createFileGroupDescriptor(mURIList, &hGlobal);
     316            const bool fUnicode = lIndex == FormatIndex_FileDescriptorW;
     317
     318            LogFlowFunc(("FormatIndex_FileDescriptor%s\n", fUnicode ? "W" : "A"));
     319
     320            SharedClipboardURIList uriList;
     321            int rc = m_pProvider->ReadMetaData(uriList, 0 /* fFlags */);
    311322            if (RT_SUCCESS(rc))
    312323            {
    313                 pMedium->tymed   = TYMED_HGLOBAL;
    314                 pMedium->hGlobal = hGlobal;
    315 
    316                 hr = S_OK;
     324                HGLOBAL hGlobal;
     325                rc = createFileGroupDescriptor(uriList, fUnicode, &hGlobal);
     326                if (RT_SUCCESS(rc))
     327                {
     328                    pMedium->tymed   = TYMED_HGLOBAL;
     329                    pMedium->hGlobal = hGlobal;
     330                    /* Note: hGlobal now is being owned by pMedium / the caller. */
     331
     332                    hr = S_OK;
     333                }
    317334            }
    318335            break;
    319336        }
    320337
    321         case FormatIndex_FileDescriptorW:
    322             LogFlowFunc(("FormatIndex_FileDescriptorW\n"));
    323             break;
    324 
    325338        case FormatIndex_FileContents:
    326339        {
    327340            LogFlowFunc(("FormatIndex_FileContents\n"));
    328341
    329             hr = VBoxClipboardWinStreamImpl::Create(&mpStream);
     342            hr = VBoxClipboardWinStreamImpl::Create(m_pProvider, &m_pStream);
    330343            if (SUCCEEDED(hr))
    331344            {
    332345                /* Hand over the stream to the caller. */
    333346                pMedium->tymed          = TYMED_ISTREAM;
    334                 pMedium->pstm           = mpStream;
     347                pMedium->pstm           = m_pStream;
    335348            }
    336349
     
    406419STDMETHODIMP VBoxClipboardWinDataObject::EnumFormatEtc(DWORD dwDirection, IEnumFORMATETC **ppEnumFormatEtc)
    407420{
    408     LogFlowFunc(("dwDirection=%RI32, mcFormats=%RI32, mpFormatEtc=%p\n", dwDirection, mcFormats, mpFormatEtc));
     421    LogFlowFunc(("dwDirection=%RI32, mcFormats=%RI32, mpFormatEtc=%p\n", dwDirection, m_cFormats, m_pFormatEtc));
    409422
    410423    HRESULT hr;
    411424    if (dwDirection == DATADIR_GET)
    412         hr = VBoxClipboardWinEnumFormatEtc::CreateEnumFormatEtc(mcFormats, mpFormatEtc, ppEnumFormatEtc);
     425        hr = VBoxClipboardWinEnumFormatEtc::CreateEnumFormatEtc(m_cFormats, m_pFormatEtc, ppEnumFormatEtc);
    413426    else
    414427        hr = E_NOTIMPL;
     
    476489 */
    477490
    478 int VBoxClipboardWinDataObject::Init(uint32_t idClient)
    479 {
    480     muClientID = idClient;
    481 
     491int VBoxClipboardWinDataObject::Init(void)
     492{
    482493    LogFlowFuncLeaveRC(VINF_SUCCESS);
    483494    return VINF_SUCCESS;
     
    572583    /* puIndex is optional. */
    573584
    574     for (ULONG i = 0; i < mcFormats; i++)
    575     {
    576         if(    (pFormatEtc->tymed & mpFormatEtc[i].tymed)
    577             && pFormatEtc->cfFormat == mpFormatEtc[i].cfFormat
    578             && pFormatEtc->dwAspect == mpFormatEtc[i].dwAspect)
     585    for (ULONG i = 0; i < m_cFormats; i++)
     586    {
     587        if(    (pFormatEtc->tymed & m_pFormatEtc[i].tymed)
     588            && pFormatEtc->cfFormat == m_pFormatEtc[i].cfFormat
     589            && pFormatEtc->dwAspect == m_pFormatEtc[i].dwAspect)
    579590        {
    580591            LogRel3(("Clipboard: Format found: tyMed=%RI32, cfFormat=%RI16, sFormats=%s, dwAspect=%RI32, ulIndex=%RU32\n",
    581                       pFormatEtc->tymed, pFormatEtc->cfFormat, VBoxClipboardWinDataObject::ClipboardFormatToString(mpFormatEtc[i].cfFormat),
     592                      pFormatEtc->tymed, pFormatEtc->cfFormat, VBoxClipboardWinDataObject::ClipboardFormatToString(m_pFormatEtc[i].cfFormat),
    582593                      pFormatEtc->dwAspect, i));
    583594            if (puIndex)
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette