IOLEOBJ.CPP

/* 
* IOLEOBJ.CPP
* Cosmo Handler Chapter 19
*
* Implementation of the IOleObject interface for Cosmo Handler.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/


#include "hcosmo.h"


/*
* CImpIOleObject::CImpIOleObject
* CImpIOleObject::~CImpIOleObject
*
* Parameters (Constructor):
* pObj PCFigure of the object we're in.
* pUnkOuter LPUNKNOWN to which we delegate.
*/

CImpIOleObject::CImpIOleObject(PCFigure pObj, LPUNKNOWN pUnkOuter)
{
m_cRef=0;
m_pObj=pObj;
m_pUnkOuter=pUnkOuter;
return;
}

CImpIOleObject::~CImpIOleObject(void)
{
return;
}



/*
* CImpIOleObject::QueryInterface
* CImpIOleObject::AddRef
* CImpIOleObject::Release
*/

STDMETHODIMP CImpIOleObject::QueryInterface(REFIID riid, PPVOID ppv)
{
return m_pUnkOuter->QueryInterface(riid, ppv);
}


STDMETHODIMP_(ULONG) CImpIOleObject::AddRef(void)
{
++m_cRef;
return m_pUnkOuter->AddRef();
}

STDMETHODIMP_(ULONG) CImpIOleObject::Release(void)
{
--m_cRef;
return m_pUnkOuter->Release();
}



/*
* The only member function we need to implement in a handler is
* IOleObject::GetExtent since we know exactly how large our data
* is. All others can be delegated.
*/


/*
* CImpIOleObject::GetExtent
*
* Purpose:
* Retrieves the size of the object in HIMETRIC units.
*
* Parameters:
* dwAspect DWORD of the aspect requested
* pszl LPSIZEL into which to store the size.
*
* Return Value:
* HRESULT NOERROR if successful, error code otherwise.
*/

STDMETHODIMP CImpIOleObject::GetExtent(DWORD dwAspect, LPSIZEL pszl)
{
//We can just use IViewObject2 for this.
return m_pObj->m_pImpIViewObject2->GetExtent(dwAspect, -1
, NULL, pszl);
}



/*
* CImpIOleObject::DoVerb
*
* An example of displaying a message when the local server is not
* present. This is a good way to get some free advertising if you
* allow free redistribution of your handler with documents
* containing your objects.
*/

STDMETHODIMP CImpIOleObject::DoVerb(LONG iVerb, LPMSG pMSG
, LPOLECLIENTSITE pSite, LONG lIndex, HWND hWnd, LPCRECT prc)
{
HRESULT hr;

hr=m_pObj->m_pDefIOleObject->DoVerb(iVerb, pMSG, pSite, lIndex
, hWnd, prc);

if (FAILED(hr))
{
MessageBox(hWnd, TEXT("Local server not present.\nIf\
I wanted to make money\nI would put some advertising here.")
, TEXT("Cosmo Handler"), MB_OK);
}

return hr;
}





STDMETHODIMP CImpIOleObject::SetClientSite
(LPOLECLIENTSITE pIOleClientSite)
{
return m_pObj->m_pDefIOleObject->SetClientSite(pIOleClientSite);
}

STDMETHODIMP CImpIOleObject::GetClientSite
(LPOLECLIENTSITE *ppSite)
{
return m_pObj->m_pDefIOleObject->GetClientSite(ppSite);
}

STDMETHODIMP CImpIOleObject::SetHostNames(LPCOLESTR pszApp
, LPCOLESTR pszObj)
{
return m_pObj->m_pDefIOleObject->SetHostNames(pszApp, pszObj);
}

STDMETHODIMP CImpIOleObject::Close(DWORD dwSaveOption)
{
return m_pObj->m_pDefIOleObject->Close(dwSaveOption);
}

STDMETHODIMP CImpIOleObject::SetMoniker(DWORD dwWhich
, LPMONIKER pmk)
{
return m_pObj->m_pDefIOleObject->SetMoniker(dwWhich, pmk);
}

STDMETHODIMP CImpIOleObject::GetMoniker(DWORD dwAssign
, DWORD dwWhich, LPMONIKER *ppmk)
{
return m_pObj->m_pDefIOleObject->GetMoniker(dwAssign, dwWhich
, ppmk);
}

STDMETHODIMP CImpIOleObject::InitFromData(LPDATAOBJECT pIDataObject
, BOOL fCreation, DWORD dw)
{
return m_pObj->m_pDefIOleObject->InitFromData(pIDataObject
, fCreation, dw);
}

STDMETHODIMP CImpIOleObject::GetClipboardData(DWORD dwReserved
, LPDATAOBJECT *ppIDataObj)
{
return m_pObj->m_pDefIOleObject->GetClipboardData(dwReserved
, ppIDataObj);
}

STDMETHODIMP CImpIOleObject::EnumVerbs(LPENUMOLEVERB *ppEnum)
{
return m_pObj->m_pDefIOleObject->EnumVerbs(ppEnum);
}

STDMETHODIMP CImpIOleObject::Update(void)
{
return m_pObj->m_pDefIOleObject->Update();
}

STDMETHODIMP CImpIOleObject::IsUpToDate(void)
{
return m_pObj->m_pDefIOleObject->IsUpToDate();
}

STDMETHODIMP CImpIOleObject::GetUserClassID(LPCLSID pClsID)
{
return m_pObj->m_pDefIOleObject->GetUserClassID(pClsID);
}

STDMETHODIMP CImpIOleObject::GetUserType(DWORD dwForm
, LPOLESTR *ppszType)
{
return m_pObj->m_pDefIOleObject->GetUserType(dwForm, ppszType);
}

STDMETHODIMP CImpIOleObject::SetExtent(DWORD dwAspect, LPSIZEL pszl)
{
return m_pObj->m_pDefIOleObject->SetExtent(dwAspect, pszl);
}

STDMETHODIMP CImpIOleObject::Advise(LPADVISESINK pIAdviseSink
, LPDWORD pdwConn)
{
return m_pObj->m_pDefIOleObject->Advise(pIAdviseSink, pdwConn);
}

STDMETHODIMP CImpIOleObject::Unadvise(DWORD dwConn)
{
return m_pObj->m_pDefIOleObject->Unadvise(dwConn);
}

STDMETHODIMP CImpIOleObject::EnumAdvise(LPENUMSTATDATA *ppEnum)
{
return m_pObj->m_pDefIOleObject->EnumAdvise(ppEnum);
}

STDMETHODIMP CImpIOleObject::GetMiscStatus(DWORD dwAspect
, LPDWORD pdwStatus)
{
return m_pObj->m_pDefIOleObject->GetMiscStatus(dwAspect
, pdwStatus);
}

STDMETHODIMP CImpIOleObject::SetColorScheme(LPLOGPALETTE pLP)
{
return m_pObj->m_pDefIOleObject->SetColorScheme(pLP);
}