Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

194 lines
4.6 KiB

/*
* AMBIENTS.CPP
* Implementation of the ambient properties IDispatch on a
* control site.
*
* Copyright (c)1995-1996 Microsoft Corporation, All Rights Reserved
*/
#include "stdafx.h"
#include <docobj.h>
#include "site.h"
#include "proxyframe.h"
#include "mshtmdid.h"
/*
* CImpAmbientIDispatch::CImpAmbientIDispatch
* CImpAmbientIDispatch::~CImpAmbientIDispatch
*
* Parameters (Constructor):
* pSite PCSite of the site we're in.
* pUnkOuter LPUNKNOWN to which we delegate.
*/
CImpAmbientIDispatch::CImpAmbientIDispatch( PCSite pSite, LPUNKNOWN pUnkOuter)
{
m_cRef = 0;
m_pSite = pSite;
m_pUnkOuter = pUnkOuter;
return;
}
CImpAmbientIDispatch::~CImpAmbientIDispatch(void)
{
return;
}
/*
* CImpAmbientIDispatch::QueryInterface
* CImpAmbientIDispatch::AddRef
* CImpAmbientIDispatch::Release
*/
STDMETHODIMP CImpAmbientIDispatch::QueryInterface(REFIID riid, void** ppv)
{
return m_pUnkOuter->QueryInterface(riid, ppv);
}
STDMETHODIMP_(ULONG) CImpAmbientIDispatch::AddRef(void)
{
++m_cRef;
return m_pUnkOuter->AddRef();
}
STDMETHODIMP_(ULONG) CImpAmbientIDispatch::Release(void)
{
m_cRef--;
return m_pUnkOuter->Release();
}
/*
* CImpAmbientIDispatch::GetTypeInfoCount
* CImpAmbientIDispatch::GetTypeInfo
* CImpAmbientIDispatch::GetIDsOfNames
*
* Unimplemented members, not needed for ambient properties.
*/
STDMETHODIMP CImpAmbientIDispatch::GetTypeInfoCount(UINT *pctInfo)
{
*pctInfo=0;
return E_NOTIMPL;
}
STDMETHODIMP CImpAmbientIDispatch::GetTypeInfo(
UINT /*itinfo*/,
LCID /*lcid*/,
ITypeInfo** pptInfo
)
{
*pptInfo=NULL;
return ResultFromScode(E_NOTIMPL);
}
STDMETHODIMP CImpAmbientIDispatch::GetIDsOfNames(
REFIID /*riid*/,
OLECHAR** rgszNames,
UINT /*cNames*/,
LCID /*lcid*/,
DISPID* rgDispID)
{
*rgszNames = NULL;
*rgDispID = NULL;
return ResultFromScode(E_NOTIMPL);
}
/*
* CImpAmbientIDispatch::Invoke
*
* Purpose:
* Calls a method in the dispatch interface or manipulates a
* property.
*
* Parameters:
* dispIDMember DISPID of the method or property of interest.
* riid REFIID reserved, must be NULL.
* lcid LCID of the locale.
* wFlags USHORT describing the context of the invocation.
* pDispParams DISPPARAMS * to the array of arguments.
* pVarResult VARIANT * in which to store the result. Is
* NULL if the caller is not interested.
* pExcepInfo EXCEPINFO * to exception information.
* puArgErr UINT * in which to store the index of an
* invalid parameter if DISP_E_TYPEMISMATCH
* is returned.
*
* Return Value:
* HRESULT NOERROR or a general error code.
*/
STDMETHODIMP CImpAmbientIDispatch::Invoke(
DISPID dispIDMember,
REFIID riid,
LCID /*lcid*/,
unsigned short wFlags,
DISPPARAMS* /*pDispParams*/,
VARIANT* pVarResult,
EXCEPINFO* /*pExcepInfo*/,
UINT* /*puArgErr*/
)
{
HRESULT hr;
VARIANT varResult;
VARIANT_BOOL vbBool = VARIANT_FALSE;
if (IID_NULL!=riid)
return ResultFromScode(E_INVALIDARG);
if(NULL==pVarResult)
pVarResult=&varResult;
VariantInit(pVarResult);
//The most common case is boolean, use as an initial type
V_VT(pVarResult)=VT_BOOL;
/*
* Process the requested ambient property. Anything but a
* request for a property is invalid, so we can check that
* before looking at the specific ID. We can only get away
* with this because all properties are read-only.
*/
if (!(DISPATCH_PROPERTYGET & wFlags))
return ResultFromScode(DISP_E_MEMBERNOTFOUND);
hr = NOERROR;
switch (dispIDMember)
{
case DISPID_AMBIENT_USERMODE:
hr = m_pSite->GetFrame()->GetBrowseMode( &vbBool );
if ( SUCCEEDED ( hr ) )
{
V_BOOL(pVarResult) = vbBool;
}
break;
// BUG 542694: Disalbe the loading of frames.
case DISPID_AMBIENT_DLCONTROL:
if ( m_pSite->GetFrame() &&
m_pSite->GetFrame()->GetControl() &&
m_pSite->GetFrame()->GetControl()->IsSafeForScripting() )
{
V_VT(pVarResult)=VT_I4;
V_I4(pVarResult) =
DLCTL_DLIMAGES |
DLCTL_NO_SCRIPTS |
DLCTL_NO_DLACTIVEXCTLS |
DLCTL_NO_FRAMEDOWNLOAD |
DLCTL_NO_CLIENTPULL |
DLCTL_NOFRAMES;
}
break;
default:
hr=ResultFromScode(DISP_E_MEMBERNOTFOUND);
break;
}
return hr;
}