home *** CD-ROM | disk | FTP | other *** search
- /*
- * KOALAC.CPP
- *
- * Koala Object Reusing Animal via Containment, Chapter 2
- *
- * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
- *
- * Kraig Brockschmidt, Microsoft
- * Internet : kraigb@microsoft.com
- * Compuserve: >INTERNET:kraigb@microsoft.com
- */
-
- #include <windows.h>
- #include "reuse.h"
- #include "koalac.h"
-
-
- /*
- * CreateKoalaContainment
- *
- * Purpose:
- * Creates an instance of KoalaC returning an IUnknown
- * interface.
- *
- * Parameters:
- * ppUnk IUnknown ** in which to return the pointer.
- *
- * Return Value:
- * BOOL TRUE if successful, FALSE otherwise.
- */
-
- BOOL CreateKoalaContainment(IUnknown **ppUnk)
- {
- CKoalaC *pObj;
- HRESULT hr;
-
- pObj=new CKoalaC();
-
- if (NULL==pObj)
- return FALSE;
-
- if (!pObj->Init())
- return FALSE;
-
- hr=pObj->QueryInterface(IID_IUnknown, (PPVOID)ppUnk);
- return SUCCEEDED(hr);
- }
-
-
-
-
-
- /*
- * CKoalaC::CKoalaC
- * CKoalaC::~CKoalaC
- *
- * Constructor Parameters:
- * None
- */
-
- CKoalaC::CKoalaC(void)
- {
- m_cRef=0;
- m_pImpIAnimal=NULL;
- m_pImpIKoala=NULL;
-
- m_pIAnimal=NULL;
- return;
- }
-
- CKoalaC::~CKoalaC(void)
- {
- ReleaseInterface(m_pIAnimal);
-
- DeleteInterfaceImp(m_pImpIKoala);
- DeleteInterfaceImp(m_pImpIAnimal);
- return;
- }
-
-
-
- /*
- * CKoalaC::Init
- *
- * Purpose:
- * Instantiates the interface implementations for this object.
- *
- * Parameters:
- * None
- *
- * Return Value:
- * BOOL TRUE if initialization succeeds, FALSE otherwise.
- */
-
- BOOL CKoalaC::Init(void)
- {
- HRESULT hr;
-
- //Create our interface
- m_pImpIAnimal=new CImpIAnimal_K(this);
-
- if (NULL==m_pImpIAnimal)
- return FALSE;
-
- m_pImpIKoala=new CImpIKoala_C(this);
-
- if (NULL==m_pImpIKoala)
- return FALSE;
-
- /*
- * Create an instance of the Animal object and save an
- * IAnimal pointer. We use Animal's global API function
- * for this.
- */
- hr=CreateAnimal(NULL, IID_IAnimal, (void **)&m_pIAnimal);
-
- if (FAILED(hr))
- return FALSE;
-
- return TRUE;
- }
-
-
-
-
-
-
- /*
- * CKoalaC::QueryInterface
- * CKoalaC::AddRef
- * CKoalaC::Release
- *
- * Purpose:
- * KoalaC's IUnknown implementation.
- */
-
- STDMETHODIMP CKoalaC::QueryInterface(REFIID riid, PPVOID ppv)
- {
- *ppv=NULL;
-
- if (IID_IUnknown==riid)
- *ppv=this;
-
- if (IID_IAnimal==riid)
- *ppv=m_pImpIAnimal;
-
- if (IID_IKoala==riid)
- *ppv=m_pImpIKoala;
-
- if (NULL==*ppv)
- return ResultFromScode(E_NOINTERFACE);
-
- ((LPUNKNOWN)*ppv)->AddRef();
- return NOERROR;
- }
-
-
- DWORD CKoalaC::AddRef(void)
- {
- return ++m_cRef;
- }
-
- DWORD CKoalaC::Release(void)
- {
- if (0!=--m_cRef)
- return m_cRef;
-
- delete this;
- return 0;
- }
-
-
-
-
- //CImpIAnimal_K interface implementation
-
-
- /*
- * CImpIAnimal_K::CImpIAnimal_K
- * CImpIAnimal_K::~CImpIAnimal_K
- *
- * Constructor Parameters:
- * pObj PCKoalaC to the outer object
- */
-
- CImpIAnimal_K::CImpIAnimal_K(PCKoalaC pObj)
- {
- m_cRef=0;
- m_pObj=pObj;
- return;
- }
-
- CImpIAnimal_K::~CImpIAnimal_K(void)
- {
- return;
- }
-
-
-
- /*
- * CImpIAnimal_K::QueryInterface
- * CImpIAnimal_K::AddRef
- * CImpIAnimal_K::Release
- *
- * IUnknown members that delegate to KoalaC
- */
-
- STDMETHODIMP CImpIAnimal_K::QueryInterface(REFIID riid, PPVOID ppv)
- {
- return m_pObj->QueryInterface(riid, ppv);
- }
-
- DWORD CImpIAnimal_K::AddRef(void)
- {
- ++m_cRef;
- return m_pObj->AddRef();
- }
-
- DWORD CImpIAnimal_K::Release(void)
- {
- --m_cRef;
- return m_pObj->Release();
- }
-
-
-
- /*
- * CImpIAnimal_K::Eat
- * CImpIAnimal_K::Sleep
- * CImpIAnimal_K::Procreate
- *
- * Purpose:
- * Empty sample functions, no parameters, return NOERROR
- */
-
- STDMETHODIMP CImpIAnimal_K::Eat(void)
- {
- ODS("KoalaC's IAnimal::Eat called");
-
- //Call contained object
- m_pObj->m_pIAnimal->Eat();
- return NOERROR;
- }
-
- STDMETHODIMP CImpIAnimal_K::Sleep(void)
- {
- ODS("KoalaC's IAnimal::Sleep called");
-
- //Call contained object
- m_pObj->m_pIAnimal->Sleep();
- return NOERROR;
- }
-
- STDMETHODIMP CImpIAnimal_K::Procreate(void)
- {
- ODS("KoalaC's IAnimal::Procreate called");
-
- //Call contained object
- m_pObj->m_pIAnimal->Procreate();
- return NOERROR;
- }
-
-
-
-
- //CImpIKoala_C interface implementation
-
-
- /*
- * CImpIKoala_C::CImpIKoala_C
- * CImpIKoala_C::~CImpIKoala_C
- *
- * Constructor Parameters:
- * pObj PCKoalaC to the outer object
- */
-
- CImpIKoala_C::CImpIKoala_C(PCKoalaC pObj)
- {
- m_cRef=0;
- m_pObj=pObj;
- return;
- }
-
- CImpIKoala_C::~CImpIKoala_C(void)
- {
- return;
- }
-
-
-
- /*
- * CImpIKoala_C::QueryInterface
- * CImpIKoala_C::AddRef
- * CImpIKoala_C::Release
- *
- * IUnknown members that delegate to KoalaC
- */
-
- STDMETHODIMP CImpIKoala_C::QueryInterface(REFIID riid, PPVOID ppv)
- {
- return m_pObj->QueryInterface(riid, ppv);
- }
-
- DWORD CImpIKoala_C::AddRef(void)
- {
- ++m_cRef;
- return m_pObj->AddRef();
- }
-
- DWORD CImpIKoala_C::Release(void)
- {
- --m_cRef;
- return m_pObj->Release();
- }
-
-
-
- /*
- * CImpIKoala_C::ClimbEucalyptusTrees
- * CImpIKoala_C::PouchOpensDown
- * CImpIKoala_C::SleepForHoursAfterEating
- *
- * Purpose:
- * Empty sample functions, no parameters, return NOERROR
- */
-
- STDMETHODIMP CImpIKoala_C::ClimbEucalyptusTrees(void)
- {
- ODS("KoalaC's IKoala::ClimbEucalyptusTrees called");
- return NOERROR;
- }
-
- STDMETHODIMP CImpIKoala_C::PouchOpensDown(void)
- {
- ODS("KoalaC's IKoala::PouchOpensDown called");
- return NOERROR;
- }
-
- STDMETHODIMP CImpIKoala_C::SleepForHoursAfterEating(void)
- {
- ODS("KoalaC's IKoala::SleepForHoursAfterEating called");
- return NOERROR;
- }
-