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 / datauser / iadvsink.cpp < prev    next >
C/C++ Source or Header  |  1995-05-03  |  5KB  |  228 lines

  1. /*
  2.  * IADVSINK.CPP
  3.  * Data Object User Chapter 10
  4.  *
  5.  * Implementation of an object with IAdviseSink.
  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 "datauser.h"
  16.  
  17.  
  18. /*
  19.  * CAdviseSink::CAdviseSink
  20.  * CAdviseSink::~CAdviseSink
  21.  *
  22.  * Parameters (Constructor):
  23.  *  pApp            PAPP to the application
  24.  *
  25.  */
  26.  
  27. CAdviseSink::CAdviseSink(PAPP pApp)
  28.     {
  29.     m_cRef=0;
  30.     m_pApp=pApp;
  31.     return;
  32.     }
  33.  
  34. CAdviseSink::~CAdviseSink(void)
  35.     {
  36.     return;
  37.     }
  38.  
  39.  
  40.  
  41.  
  42. /*
  43.  * CAdviseSink::QueryInterface
  44.  * CAdviseSink::AddRef
  45.  * CAdviseSink::Release
  46.  *
  47.  * Purpose:
  48.  *  IUnknown members for CAdviseSink object.
  49.  */
  50.  
  51. STDMETHODIMP CAdviseSink::QueryInterface(REFIID riid, PPVOID ppv)
  52.     {
  53.     *ppv=NULL;
  54.  
  55.     if (IID_IUnknown==riid || IID_IAdviseSink==riid)
  56.         *ppv=this;
  57.  
  58.     if (NULL!=*ppv)
  59.         {
  60.         ((LPUNKNOWN)*ppv)->AddRef();
  61.         return NOERROR;
  62.         }
  63.  
  64.     return ResultFromScode(E_NOINTERFACE);
  65.     }
  66.  
  67.  
  68. STDMETHODIMP_(ULONG) CAdviseSink::AddRef(void)
  69.     {
  70.     return ++m_cRef;
  71.     }
  72.  
  73.  
  74. STDMETHODIMP_(ULONG) CAdviseSink::Release(void)
  75.     {
  76.     if (0!=--m_cRef)
  77.         return m_cRef;
  78.  
  79.     delete this;
  80.     return 0;
  81.     }
  82.  
  83.  
  84.  
  85.  
  86. /*
  87.  * CAdviseSink::OnDataChange
  88.  *
  89.  * Purpose:
  90.  *  Notifes the advise sink that data changed in a data object.
  91.  *  On this message you may request a new data rendering and update
  92.  *  your displays as necessary.  Any data sent to this function is
  93.  *  owned by the caller, not by this advise sink.
  94.  *
  95.  *  All Advise Sink methods are asynchronous and therefore we
  96.  *  should attempt no synchronous calls from within them to an EXE
  97.  *  object.  If we do, we'll get RPC_E_CALLREJECTED as shown below.
  98.  *
  99.  * Parameters:
  100.  *  pFEIn           LPFORMATETC describing format that changed
  101.  *  pSTM            LPSTGMEDIUM providing the medium in which the
  102.  *                  data is provided.
  103.  *
  104.  * Return Value:
  105.  *  None
  106.  */
  107.  
  108.  
  109. STDMETHODIMP_(void) CAdviseSink::OnDataChange(LPFORMATETC pFE
  110.     , LPSTGMEDIUM pSTM)
  111.     {
  112.     BOOL        fUsable=TRUE;
  113.     UINT        cf;
  114.     STGMEDIUM   stm;
  115.  
  116.     /*
  117.      * We first check that the changed data is, in fact, a format
  118.      * we're interested in, either CF_TEXT, CF_BITMAP, or
  119.      * CF_METAFILEPICT, then only in the aspects we want.  We check
  120.      * if pSTM->tymed is TYMED_NULL or something else.  If NULL, we
  121.      * just exit so the data object can time ADVF_NODATA trans-
  122.      * actions.  Otherwise we verify that the data is useful and
  123.      * repaint. If there is data in pSTM we are responsible for it.
  124.      */
  125.  
  126.     //Ignore the m_fGetData flag for EXE objects (we can't GetData)
  127.     if (!m_pApp->m_fGetData && !m_pApp->m_fEXE)
  128.         return;
  129.  
  130.     //See if we're interested in the format and aspect that changed
  131.     cf=pFE->cfFormat;
  132.  
  133.     if ((CF_TEXT!=cf && CF_BITMAP!=cf && CF_METAFILEPICT!=cf)
  134.         || !(DVASPECT_CONTENT & pFE->dwAspect))
  135.         return;
  136.  
  137.     //Check the medium if we got data
  138.     switch (cf)
  139.         {
  140.         case CF_TEXT:
  141.             fUsable=(BOOL)(TYMED_HGLOBAL & pFE->tymed);
  142.             break;
  143.  
  144.         case CF_BITMAP:
  145.             fUsable=(BOOL)(TYMED_GDI & pFE->tymed);
  146.             break;
  147.  
  148.         case CF_METAFILEPICT:
  149.             fUsable=(BOOL)(TYMED_MFPICT & pFE->tymed);
  150.             break;
  151.  
  152.         default:
  153.             break;
  154.         }
  155.  
  156.     if (!fUsable)
  157.         return;
  158.  
  159.     if (NULL==m_pApp->m_pIDataObject)
  160.         return;
  161.  
  162.     /*
  163.      * When dealing with EXE objects, invalidate ourselves
  164.      * after setting TYMED_NULL in our STGMEDIUM that causes
  165.      * CAppVars::Paint to request new data.  We cannot call
  166.      * GetData in here because this is an async call when we're
  167.      * dealing with an EXE.
  168.      */
  169.     if (m_pApp->m_fEXE)
  170.         {
  171.         ReleaseStgMedium(&(m_pApp->m_stm));
  172.         m_pApp->m_cf=cf;
  173.         m_pApp->m_stm.tymed=TYMED_NULL;
  174.  
  175.         InvalidateRect(m_pApp->m_hWnd, NULL, TRUE);
  176.         return;
  177.         }
  178.  
  179.     if (FAILED(m_pApp->m_pIDataObject->GetData(pFE, &stm)))
  180.         return;
  181.  
  182.     //Get rid of old data and update.
  183.     ReleaseStgMedium(&(m_pApp->m_stm));
  184.  
  185.     m_pApp->m_cf=cf;
  186.     m_pApp->m_stm=stm;
  187.  
  188.     InvalidateRect(m_pApp->m_hWnd, NULL, TRUE);
  189.  
  190.     if (m_pApp->m_fRepaint)
  191.         UpdateWindow(m_pApp->m_hWnd);
  192.  
  193.     return;
  194.     }
  195.  
  196.  
  197.  
  198.  
  199. /*
  200.  * CAdviseSink::OnViewChange
  201.  * CAdviseSink::OnRename
  202.  * CAdviseSink::OnSave
  203.  * CAdviseSink::OnClose
  204.  *
  205.  * Unimplemented members
  206.  */
  207.  
  208. STDMETHODIMP_(void) CAdviseSink::OnViewChange(DWORD dwAspect
  209.     , LONG lindex)
  210.     {
  211.     return;
  212.     }
  213.  
  214. STDMETHODIMP_(void) CAdviseSink::OnRename(LPMONIKER pmk)
  215.     {
  216.     return;
  217.     }
  218.  
  219. STDMETHODIMP_(void) CAdviseSink::OnSave(void)
  220.     {
  221.     return;
  222.     }
  223.  
  224. STDMETHODIMP_(void) CAdviseSink::OnClose(void)
  225.     {
  226.     return;
  227.     }
  228.