home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / chap10 / edataobj / idataobj.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-03  |  9.0 KB  |  416 lines

  1. /*
  2.  * IDATAOBJ.CPP
  3.  * Data Object Chapter 10
  4.  *
  5.  * Implementation of the IDataObject interface for CDataObject.
  6.  *
  7.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Microsoft
  10.  * Internet  :  kraigb@microsoft.com
  11.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  12.  */
  13.  
  14.  
  15. #include "dataobj.h"
  16.  
  17.  
  18.  
  19. /*
  20.  * CImpIDataObject::CImpIDataObject
  21.  * CImpIDataObject::~CImpIDataObject
  22.  *
  23.  * Parameters (Constructor):
  24.  *  pObj            PCDataObject of the object we're in.
  25.  *  pUnkOuter       LPUNKNOWN to which we delegate.
  26.  */
  27.  
  28. CImpIDataObject::CImpIDataObject(PCDataObject pObj
  29.     , LPUNKNOWN pUnkOuter)
  30.     {
  31.     m_cRef=0;
  32.     m_pObj=pObj;
  33.     m_pUnkOuter=pUnkOuter;
  34.     return;
  35.     }
  36.  
  37. CImpIDataObject::~CImpIDataObject(void)
  38.     {
  39.     return;
  40.     }
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47. /*
  48.  * CImpIDataObject::QueryInterface
  49.  * CImpIDataObject::AddRef
  50.  * CImpIDataObject::Release
  51.  *
  52.  * Purpose:
  53.  *  IUnknown members for CImpIDataObject object.
  54.  */
  55.  
  56. STDMETHODIMP CImpIDataObject::QueryInterface(REFIID riid, PPVOID ppv)
  57.     {
  58.     return m_pUnkOuter->QueryInterface(riid, ppv);
  59.     }
  60.  
  61.  
  62. STDMETHODIMP_(ULONG) CImpIDataObject::AddRef(void)
  63.     {
  64.     ++m_cRef;
  65.     return m_pUnkOuter->AddRef();
  66.     }
  67.  
  68. STDMETHODIMP_(ULONG) CImpIDataObject::Release(void)
  69.     {
  70.     --m_cRef;
  71.     return m_pUnkOuter->Release();
  72.     }
  73.  
  74.  
  75.  
  76.  
  77.  
  78. /*
  79.  * CImpIDataObject::GetData
  80.  *
  81.  * Purpose:
  82.  *  Retrieves data described by a specific FormatEtc into a StgMedium
  83.  *  allocated by this function.  Used like GetClipboardData.
  84.  *
  85.  * Parameters:
  86.  *  pFE             LPFORMATETC describing the desired data.
  87.  *  pSTM            LPSTGMEDIUM in which to return the data.
  88.  *
  89.  * Return Value:
  90.  *  HRESULT         NOERROR or a general error value.
  91.  */
  92.  
  93. STDMETHODIMP CImpIDataObject::GetData(LPFORMATETC pFE
  94.     , LPSTGMEDIUM pSTM)
  95.     {
  96.     UINT            cf=pFE->cfFormat;
  97.  
  98.     //Check the aspects we support.
  99.     if (!(DVASPECT_CONTENT & pFE->dwAspect))
  100.         return ResultFromScode(DATA_E_FORMATETC);
  101.  
  102.     switch (cf)
  103.         {
  104.         case CF_METAFILEPICT:
  105.             if (!(TYMED_MFPICT & pFE->tymed))
  106.                 break;
  107.  
  108.             return m_pObj->RenderMetafilePict(pSTM);
  109.  
  110.         case CF_BITMAP:
  111.             if (!(TYMED_GDI & pFE->tymed))
  112.                 break;
  113.  
  114.             return m_pObj->RenderBitmap(pSTM);
  115.  
  116.         case CF_TEXT:
  117.             if (!(TYMED_HGLOBAL & pFE->tymed))
  118.                 break;
  119.  
  120.             return m_pObj->RenderText(pSTM);
  121.  
  122.         default:
  123.             break;
  124.         }
  125.  
  126.     return ResultFromScode(DATA_E_FORMATETC);
  127.     }
  128.  
  129.  
  130.  
  131.  
  132. /*
  133.  * CImpIDataObject::GetDataHere
  134.  *
  135.  * Purpose:
  136.  *  Renders the specific FormatEtc into caller-allocated medium
  137.  *  provided in pSTM.
  138.  *
  139.  * Parameters:
  140.  *  pFE             LPFORMATETC describing the desired data.
  141.  *  pSTM            LPSTGMEDIUM providing the medium into which
  142.  *                  wer render the data.
  143.  *
  144.  * Return Value:
  145.  *  HRESULT         NOERROR or a general error value.
  146.  */
  147.  
  148. STDMETHODIMP CImpIDataObject::GetDataHere(LPFORMATETC pFE
  149.     , LPSTGMEDIUM pSTM)
  150.     {
  151.     return ResultFromScode(E_NOTIMPL);
  152.     }
  153.  
  154.  
  155.  
  156.  
  157.  
  158.  
  159. /*
  160.  * CImpIDataObject::QueryGetData
  161.  *
  162.  * Purpose:
  163.  *  Tests if a call to GetData with this FormatEtc will provide
  164.  *  any rendering; used like IsClipboardFormatAvailable.
  165.  *
  166.  * Parameters:
  167.  *  pFE             LPFORMATETC describing the desired data.
  168.  *
  169.  * Return Value:
  170.  *  HRESULT         NOERROR or a general error value.
  171.  */
  172.  
  173. STDMETHODIMP CImpIDataObject::QueryGetData(LPFORMATETC pFE)
  174.     {
  175.     UINT            cf=pFE->cfFormat;
  176.     BOOL            fRet=FALSE;
  177.  
  178.     //Check the aspects we support.
  179.     if (!(DVASPECT_CONTENT & pFE->dwAspect))
  180.         return ResultFromScode(DATA_E_FORMATETC);
  181.  
  182.     switch (cf)
  183.         {
  184.         case CF_METAFILEPICT:
  185.             fRet=(BOOL)(pFE->tymed & TYMED_MFPICT);
  186.             break;
  187.  
  188.         case CF_BITMAP:
  189.             fRet=(BOOL)(pFE->tymed & TYMED_GDI);
  190.             break;
  191.  
  192.         case CF_TEXT:
  193.             fRet=(BOOL)(pFE->tymed & TYMED_HGLOBAL);
  194.             break;
  195.  
  196.         default:
  197.             fRet=FALSE;
  198.             break;
  199.         }
  200.  
  201.     return fRet ? NOERROR : ResultFromScode(S_FALSE);
  202.     }
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209. /*
  210.  * CImpIDataObject::GetCanonicalFormatEtc
  211.  *
  212.  * Purpose:
  213.  *  Provides the caller with an equivalent FormatEtc to the one
  214.  *  provided when different FormatEtcs will produce exactly the
  215.  *  same renderings.
  216.  *
  217.  * Parameters:
  218.  *  pFEIn            LPFORMATETC of the first description.
  219.  *  pFEOut           LPFORMATETC of the equal description.
  220.  *
  221.  * Return Value:
  222.  *  HRESULT         NOERROR or a general error value.
  223.  */
  224.  
  225. STDMETHODIMP CImpIDataObject::GetCanonicalFormatEtc
  226.     (LPFORMATETC pFEIn, LPFORMATETC pFEOut)
  227.     {
  228.     if (NULL==pFEOut)
  229.         return ResultFromScode(E_INVALIDARG);
  230.  
  231.     pFEOut->ptd=NULL;
  232.     return ResultFromScode(DATA_S_SAMEFORMATETC);
  233.     }
  234.  
  235.  
  236.  
  237.  
  238.  
  239.  
  240. /*
  241.  * CImpIDataObject::SetData
  242.  *
  243.  * Purpose:
  244.  *  Places data described by a FormatEtc and living in a StgMedium
  245.  *  into the object.  The object may be responsible to clean up the
  246.  *  StgMedium before exiting.
  247.  *
  248.  * Parameters:
  249.  *  pFE             LPFORMATETC describing the data to set.
  250.  *  pSTM            LPSTGMEDIUM containing the data.
  251.  *  fRelease        BOOL indicating if this function is responsible
  252.  *                  for freeing the data.
  253.  *
  254.  * Return Value:
  255.  *  HRESULT         NOERROR or a general error value.
  256.  */
  257.  
  258. STDMETHODIMP CImpIDataObject::SetData(LPFORMATETC pFE
  259.     , LPSTGMEDIUM pSTM, BOOL fRelease)
  260.     {
  261.     return ResultFromScode(DATA_E_FORMATETC);
  262.     }
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269. /*
  270.  * CImpIDataObject::EnumFormatEtc
  271.  *
  272.  * Purpose:
  273.  *  Returns an IEnumFORMATETC object through which the caller can
  274.  *  iterate to learn about all the data formats this object can
  275.  *  provide through either GetData[Here] or SetData.
  276.  *
  277.  * Parameters:
  278.  *  dwDir           DWORD describing a data direction, either
  279.  *                  DATADIR_SET or DATADIR_GET.
  280.  *  ppEnum          LPENUMFORMATETC * in which to return the
  281.  *                  pointer to the enumerator.
  282.  *
  283.  * Return Value:
  284.  *  HRESULT         NOERROR or a general error value.
  285.  */
  286.  
  287. STDMETHODIMP CImpIDataObject::EnumFormatEtc(DWORD dwDir
  288.     , LPENUMFORMATETC *ppEnum)
  289.     {
  290.     switch (dwDir)
  291.         {
  292.         case DATADIR_GET:
  293.             *ppEnum=new CEnumFormatEtc(m_pObj->m_cfeGet
  294.                 , m_pObj->m_rgfeGet);
  295.             break;
  296.  
  297.         case DATADIR_SET:
  298.             *ppEnum=NULL;
  299.             break;
  300.  
  301.         default:
  302.             *ppEnum=NULL;
  303.             break;
  304.         }
  305.  
  306.     if (NULL==*ppEnum)
  307.         return ResultFromScode(E_FAIL);
  308.     else
  309.         (*ppEnum)->AddRef();
  310.  
  311.     return NOERROR;
  312.     }
  313.  
  314.  
  315.  
  316.  
  317.  
  318. /*
  319.  * CImpIDataObject::DAdvise
  320.  *
  321.  * Purpose:
  322.  *  Provides the data object with an IAdviseSink object that we are
  323.  *  responsible to notify when the data changes.
  324.  *
  325.  * Parameters:
  326.  *  ppFE            LPFORMATETC
  327.  *  dwFlags         DWORD carrying flags indicating how the advise
  328.  *                  sink wants to be treated.
  329.  *  pIAdviseSink    LPADVISESINK to the object to notify.
  330.  *  pdwConn         LPDWORD into which we store a DWORD key
  331.  *                  identifying the advise connection.
  332.  *
  333.  * Return Value:
  334.  *  HRESULT         NOERROR or a general error value.
  335.  */
  336.  
  337. STDMETHODIMP CImpIDataObject::DAdvise(LPFORMATETC pFE, DWORD dwFlags
  338.     , LPADVISESINK pIAdviseSink, LPDWORD pdwConn)
  339.     {
  340.     HRESULT         hr;
  341.  
  342.     if (NULL==m_pObj->m_pIDataAdviseHolder)
  343.         {
  344.         hr=CreateDataAdviseHolder(&m_pObj->m_pIDataAdviseHolder);
  345.  
  346.         if (FAILED(hr))
  347.             return ResultFromScode(E_OUTOFMEMORY);
  348.         }
  349.  
  350.     hr=m_pObj->m_pIDataAdviseHolder->Advise((LPDATAOBJECT)this, pFE
  351.         , dwFlags, pIAdviseSink, pdwConn);
  352.  
  353.     return hr;
  354.     }
  355.  
  356.  
  357.  
  358.  
  359.  
  360.  
  361. /*
  362.  * CImpIDataObject::DUnadvise
  363.  *
  364.  * Purpose:
  365.  *  Turns off advising previously set up with Advise.
  366.  *
  367.  * Parameters:
  368.  *  dwConn          DWORD connection key returned from Advise.
  369.  *
  370.  * Return Value:
  371.  *  HRESULT         NOERROR or a general error value.
  372.  */
  373.  
  374. STDMETHODIMP CImpIDataObject::DUnadvise(DWORD dwConn)
  375.     {
  376.     HRESULT         hr;
  377.  
  378.     if (NULL==m_pObj->m_pIDataAdviseHolder)
  379.         return ResultFromScode(E_FAIL);
  380.  
  381.     hr=m_pObj->m_pIDataAdviseHolder->Unadvise(dwConn);
  382.  
  383.     return hr;
  384.     }
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391. /*
  392.  * CImpIDataObject::EnumDAdvise
  393.  *
  394.  * Purpose:
  395.  *  Returns an enumerator object through which the caller can find
  396.  *  all the agents currently receiving advises on this data object.
  397.  *
  398.  * Parameters:
  399.  *  ppEnum          LPENUMSTATDATA * in which to return the
  400.  *                  enumerator.
  401.  *
  402.  * Return Value:
  403.  *  HRESULT         NOERROR or a general error value.
  404.  */
  405.  
  406. STDMETHODIMP CImpIDataObject::EnumDAdvise(LPENUMSTATDATA *ppEnum)
  407.     {
  408.     HRESULT         hr;
  409.  
  410.     if (NULL==m_pObj->m_pIDataAdviseHolder)
  411.         return ResultFromScode(E_FAIL);
  412.  
  413.     hr=m_pObj->m_pIDataAdviseHolder->EnumAdvise(ppEnum);
  414.     return hr;
  415.     }
  416.