Public Member Functions

IDataObjectImpl Class Reference

implementation of IDataObject interface More...

#include <dragdropimpl.h>

Inheritance diagram for IDataObjectImpl:
Inheritance graph
[legend]
Collaboration diagram for IDataObjectImpl:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 IDataObjectImpl (IDropSourceImpl *pDropSource)
virtual ~IDataObjectImpl ()
void CopyMedium (STGMEDIUM *pMedDest, STGMEDIUM *pMedSrc, FORMATETC *pFmtSrc)
virtual HRESULT STDMETHODCALLTYPE GetData (FORMATETC __RPC_FAR *pformatetcIn, STGMEDIUM __RPC_FAR *pmedium)
virtual HRESULT STDMETHODCALLTYPE GetDataHere (FORMATETC __RPC_FAR *pformatetc, STGMEDIUM __RPC_FAR *pmedium)
virtual HRESULT STDMETHODCALLTYPE QueryGetData (FORMATETC __RPC_FAR *pformatetc)
virtual HRESULT STDMETHODCALLTYPE GetCanonicalFormatEtc (FORMATETC __RPC_FAR *pformatectIn, FORMATETC __RPC_FAR *pformatetcOut)
virtual HRESULT STDMETHODCALLTYPE SetData (FORMATETC __RPC_FAR *pformatetc, STGMEDIUM __RPC_FAR *pmedium, BOOL fRelease)
virtual HRESULT STDMETHODCALLTYPE EnumFormatEtc (DWORD dwDirection, IEnumFORMATETC __RPC_FAR *__RPC_FAR *ppenumFormatEtc)
virtual HRESULT STDMETHODCALLTYPE DAdvise (FORMATETC __RPC_FAR *pformatetc, DWORD advf, IAdviseSink __RPC_FAR *pAdvSink, DWORD __RPC_FAR *pdwConnection)
virtual HRESULT STDMETHODCALLTYPE DUnadvise (DWORD dwConnection)
virtual HRESULT STDMETHODCALLTYPE EnumDAdvise (IEnumSTATDATA __RPC_FAR *__RPC_FAR *ppenumAdvise)

Detailed Description

implementation of IDataObject interface

Definition at line 79 of file dragdropimpl.h.


Constructor & Destructor Documentation

IDataObjectImpl::IDataObjectImpl ( IDropSourceImpl pDropSource )

Definition at line 24 of file dragdropimpl.cpp.

 :  super(IID_IDataObject),
    m_pDropSource(pDropSource),
    m_cRefCount(0)
{
}
IDataObjectImpl::~IDataObjectImpl (  ) [virtual]

Definition at line 31 of file dragdropimpl.cpp.

{
    for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it)
        ReleaseStgMedium(it->_medium);
}

Member Function Documentation

void IDataObjectImpl::CopyMedium ( STGMEDIUM *  pMedDest,
STGMEDIUM *  pMedSrc,
FORMATETC *  pFmtSrc 
)

Definition at line 140 of file dragdropimpl.cpp.

Referenced by GetData(), and SetData().

{
    switch(pMedSrc->tymed)
    {
    case TYMED_HGLOBAL:
        pMedDest->hGlobal = (HGLOBAL)OleDuplicateData(pMedSrc->hGlobal, pFmtSrc->cfFormat, 0);
        break;
    case TYMED_GDI:
        pMedDest->hBitmap = (HBITMAP)OleDuplicateData(pMedSrc->hBitmap, pFmtSrc->cfFormat, 0);
        break;
    case TYMED_MFPICT:
        pMedDest->hMetaFilePict = (HMETAFILEPICT)OleDuplicateData(pMedSrc->hMetaFilePict, pFmtSrc->cfFormat, 0);
        break;
    case TYMED_ENHMF:
        pMedDest->hEnhMetaFile = (HENHMETAFILE)OleDuplicateData(pMedSrc->hEnhMetaFile, pFmtSrc->cfFormat, 0);
        break;
    case TYMED_FILE:
        pMedDest->lpszFileName = (LPOLESTR)OleDuplicateData(pMedSrc->lpszFileName, pFmtSrc->cfFormat, 0);
        break;
    case TYMED_ISTREAM:
        pMedDest->pstm = pMedSrc->pstm;
        pMedSrc->pstm->AddRef();
        break;
    case TYMED_ISTORAGE:
        pMedDest->pstg = pMedSrc->pstg;
        pMedSrc->pstg->AddRef();
        break;
    case TYMED_NULL:
    default:
        break;
    }
    pMedDest->tymed = pMedSrc->tymed;
    pMedDest->pUnkForRelease = pMedSrc->pUnkForRelease;
}

Here is the caller graph for this function:

STDMETHODIMP IDataObjectImpl::DAdvise ( FORMATETC __RPC_FAR *  pformatetc,
DWORD  advf,
IAdviseSink __RPC_FAR *  pAdvSink,
DWORD __RPC_FAR *  pdwConnection 
) [virtual]

Definition at line 203 of file dragdropimpl.cpp.

{
    return OLE_E_ADVISENOTSUPPORTED;
}
STDMETHODIMP IDataObjectImpl::DUnadvise ( DWORD  dwConnection ) [virtual]

Definition at line 212 of file dragdropimpl.cpp.

{
    return E_NOTIMPL;
}
HRESULT STDMETHODCALLTYPE IDataObjectImpl::EnumDAdvise ( IEnumSTATDATA __RPC_FAR *__RPC_FAR *  ppenumAdvise ) [virtual]

Definition at line 218 of file dragdropimpl.cpp.

{
    return OLE_E_ADVISENOTSUPPORTED;
}
STDMETHODIMP IDataObjectImpl::EnumFormatEtc ( DWORD  dwDirection,
IEnumFORMATETC __RPC_FAR *__RPC_FAR *  ppenumFormatEtc 
) [virtual]

Definition at line 175 of file dragdropimpl.cpp.

{
    if (ppenumFormatEtc == NULL)
      return E_POINTER;

    *ppenumFormatEtc=NULL;
    switch (dwDirection)
    {
      case DATADIR_GET:
         *ppenumFormatEtc = new EnumFormatEtcImpl(_storage);

         if (!*ppenumFormatEtc)
             return E_OUTOFMEMORY;

         (*ppenumFormatEtc)->AddRef();
         break;

      case DATADIR_SET:
      default:
         return E_NOTIMPL;
         break;
    }

   return S_OK;
}
STDMETHODIMP IDataObjectImpl::GetCanonicalFormatEtc ( FORMATETC __RPC_FAR *  pformatectIn,
FORMATETC __RPC_FAR *  pformatetcOut 
) [virtual]

Definition at line 95 of file dragdropimpl.cpp.

{
    if (pformatetcOut == NULL)
        return E_INVALIDARG;

    return DATA_S_SAMEFORMATETC;
}
STDMETHODIMP IDataObjectImpl::GetData ( FORMATETC __RPC_FAR *  pformatetcIn,
STGMEDIUM __RPC_FAR *  pmedium 
) [virtual]

Definition at line 37 of file dragdropimpl.cpp.

References CopyMedium().

{
    if (pformatetcIn == NULL || pmedium == NULL)
        return E_INVALIDARG;

    pmedium->hGlobal = NULL;

    for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it)
    {
        if (pformatetcIn->tymed & it->_format->tymed &&
           pformatetcIn->dwAspect == it->_format->dwAspect &&
           pformatetcIn->cfFormat == it->_format->cfFormat)
        {
            CopyMedium(pmedium, it->_medium, it->_format);
            return S_OK;
        }
    }

    return DV_E_FORMATETC;
}

Here is the call graph for this function:

STDMETHODIMP IDataObjectImpl::GetDataHere ( FORMATETC __RPC_FAR *  pformatetc,
STGMEDIUM __RPC_FAR *  pmedium 
) [virtual]

Definition at line 60 of file dragdropimpl.cpp.

{
    return E_NOTIMPL;
}
STDMETHODIMP IDataObjectImpl::QueryGetData ( FORMATETC __RPC_FAR *  pformatetc ) [virtual]

Definition at line 67 of file dragdropimpl.cpp.

{
    if (pformatetc == NULL)
        return E_INVALIDARG;

    //support others if needed DVASPECT_THUMBNAIL  //DVASPECT_ICON   //DVASPECT_DOCPRINT
    if (!(DVASPECT_CONTENT & pformatetc->dwAspect))
        return (DV_E_DVASPECT);

    HRESULT  hr = DV_E_TYMED;

    for(StorageArray::iterator it=_storage.begin(); it!=_storage.end(); ++it)
    {
       if (pformatetc->tymed & it->_format->tymed)
       {
          if (pformatetc->cfFormat == it->_format->cfFormat)
             return S_OK;
          else
             hr = DV_E_CLIPFORMAT;
       }
       else
          hr = DV_E_TYMED;
    }

    return hr;
}
STDMETHODIMP IDataObjectImpl::SetData ( FORMATETC __RPC_FAR *  pformatetc,
STGMEDIUM __RPC_FAR *  pmedium,
BOOL  fRelease 
) [virtual]

Definition at line 105 of file dragdropimpl.cpp.

References DataStorage::_format, DataStorage::_medium, and CopyMedium().

{
    if (pformatetc == NULL || pmedium == NULL)
      return E_INVALIDARG;

    assert(pformatetc->tymed == pmedium->tymed);
    FORMATETC* fetc=new FORMATETC;
    STGMEDIUM* pStgMed = new STGMEDIUM;

    if (fetc == NULL || pStgMed == NULL)
        return E_OUTOFMEMORY;

    ZeroMemory(fetc, sizeof(FORMATETC));
    ZeroMemory(pStgMed, sizeof(STGMEDIUM));

    *fetc = *pformatetc;

    if (fRelease)
      *pStgMed = *pmedium;
    else
        CopyMedium(pStgMed, pmedium, pformatetc);

    DataStorage storage;

    storage._format = fetc;
    storage._medium = pStgMed;

    _storage.push_back(storage);

    return S_OK;
}

Here is the call graph for this function:


The documentation for this class was generated from the following files:

ROS Explorer Source Code Documentation
generated on 02.01.2013 by doxygen

ROS Explorer Homepage