ICLISITE.CPP
/* 
 * ICLISITE.CPP 
 * Patron Chapter 20 
 * 
 * Implementation of the IOleClientSite interface for 
 * Patron's tenants. 
 * 
 * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Microsoft 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#include "patron.h" 
 
 
/* 
 * CImpIOleClientSite::CImpIOleClientSite 
 * CImpIOleClientSite::~CImpIOleClientSite 
 * 
 * Parameters (Constructor): 
 *  pTenant         PCTenant of the tenant we're in. 
 *  pUnkOuter       LPUNKNOWN to which we delegate. 
 */ 
 
CImpIOleClientSite::CImpIOleClientSite(PCTenant pTenant 
    , LPUNKNOWN pUnkOuter) 
    { 
    m_cRef=0; 
    m_pTen=pTenant; 
    m_pUnkOuter=pUnkOuter; 
    return; 
    } 
 
CImpIOleClientSite::~CImpIOleClientSite(void) 
    { 
    return; 
    } 
 
 
 
 
/* 
 * CImpIOleClientSite::QueryInterface 
 * CImpIOleClientSite::AddRef 
 * CImpIOleClientSite::Release 
 * 
 * Purpose: 
 *  IUnknown members for CImpIOleClientSite object. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::QueryInterface(REFIID riid 
    , PPVOID ppv) 
    { 
    return m_pUnkOuter->QueryInterface(riid, ppv); 
    } 
 
 
STDMETHODIMP_(ULONG) CImpIOleClientSite::AddRef(void) 
    { 
    ++m_cRef; 
    return m_pUnkOuter->AddRef(); 
    } 
 
STDMETHODIMP_(ULONG) CImpIOleClientSite::Release(void) 
    { 
    --m_cRef; 
    return m_pUnkOuter->Release(); 
    } 
 
 
 
 
/* 
 * CImpIOleClientSite::SaveObject 
 * 
 * Purpose: 
 *  Requests that the container call OleSave for the object that 
 *  lives here.  Typically this happens on server shutdown. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  HRESULT         Standard. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::SaveObject(void) 
    { 
    //We're already set up with the tenant to save; this is trivial. 
    m_pTen->Update(); 
    return NOERROR; 
    } 
 
 
 
 
 
/* 
 * CImpIOleClientSite::GetMoniker 
 * 
 * Purpose: 
 *  Retrieves the moniker for the site in which this object lives, 
 *  either the moniker relative to the container or the full 
 *  moniker. 
 * 
 * Parameters: 
 *  dwAssign        DWORD specifying that the object wants moniker 
 *                  assignment.  Yeah.  Right.  Got any bridges to 
 *                  sell? 
 *  dwWhich         DWORD identifying which moniker the object 
 *                  wants, either the container's moniker, the 
 *                  moniker relative to this client site, or the 
 *                  full moniker. 
 * 
 * Return Value: 
 *  HRESULT         Standard. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::GetMoniker(DWORD dwAssign 
    , DWORD dwWhich, LPMONIKER *ppmk) 
    { 
    *ppmk=NULL; 
 
    //CHAPTER20MOD 
    /* 
     * To support linking as a container we at least have to 
     * implement this for OLEWHICKMK_CONTAINER but not for any 
     * others.  This allows OLE to update absolute monikers when 
     * it has to use the relative moniker to locate a link source. 
     */ 
 
    switch (dwWhich) 
        { 
        case OLEWHICHMK_CONTAINER: 
            //This is just the file we're living in. 
            if (NULL!=m_pTen->m_pmkFile) 
                *ppmk=m_pTen->m_pmkFile; 
 
            break; 
        } 
 
    if (NULL==*ppmk) 
        return ResultFromScode(E_FAIL); 
 
    (*ppmk)->AddRef(); 
    return NOERROR; 
    //End CHAPTER20MOD 
    } 
 
 
 
 
 
 
/* 
 * CImpIOleClientSite::GetContainer 
 * 
 * Purpose: 
 *  Returns a pointer to the document's IOleContainer interface. 
 * 
 * Parameters: 
 *  ppContainer     LPOLECONTAINER * in which to return the 
 *                  interface. 
 * 
 * Return Value: 
 *  HRESULT         Standard. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::GetContainer(LPOLECONTAINER 
    * ppContainer) 
    { 
    //Only necessary if you allow linking to embeddings 
    *ppContainer=NULL; 
    return ResultFromScode(E_NOTIMPL); 
    } 
 
 
 
 
 
 
/* 
 * CImpIOleClientSite::ShowObject 
 * 
 * Purpose: 
 *  Tells the container to bring the object fully into view as much 
 *  as possible, that is, scroll the document. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  HRESULT         Standard. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::ShowObject(void) 
    { 
    /* 
     * We let the tenant do this, since it can access the current 
     * scroll position as a friend of CPages whereas we cannot. 
     */ 
    m_pTen->ShowYourself(); 
    return NOERROR; 
    } 
 
 
 
 
 
 
/* 
 * CImpIOleClientSite::OnShowWindow 
 * 
 * Purpose: 
 *  Informs the container if the object is showing itself or 
 *  hiding itself.  This is done only in the opening mode and allows 
 *  the container to know when to shade or unshade the object. 
 * 
 * Parameters: 
 *  fShow           BOOL indiciating that the object is being shown 
 *                  (TRUE) or hidden (FALSE). 
 * Return Value: 
 *  HRESULT         Standard. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::OnShowWindow(BOOL fShow) 
    { 
    //All we have to do is tell the tenant of the open state change. 
    m_pTen->ShowAsOpen(fShow); 
    return NOERROR; 
    } 
 
 
 
 
 
 
/* 
 * CImpIOleClientSite::RequestNewObjectLayout 
 * 
 * Purpose: 
 *  Called when the object needs more room in the container. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  HRESULT         Standard. 
 */ 
 
STDMETHODIMP CImpIOleClientSite::RequestNewObjectLayout(void) 
    { 
    return ResultFromScode(E_NOTIMPL); 
    }