windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/cmp/asp/context.cpp
2020-09-26 16:20:57 +08:00

256 lines
5.6 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1996 Microsoft Corporation. All Rights Reserved.
Component: ScriptingContext object
File: Context.cpp
Owner: DmitryR
This file contains the code for the implementation of the
ScriptingContext object, which is passed to server controls
via the OnStartPage method.
===================================================================*/
#include "denpre.h"
#pragma hdrstop
#include "context.h"
#include "memchk.h"
#pragma warning (disable: 4355) // ignore: "'this' used in base member init
/*===================================================================
CScriptingContext::CScriptingContext
CScriptingContext constructor
Parameters:
IApplicationObject *pAppln Application
ISessionObject *pSession Session
IRequest *pRequest Request
IResponse *pResponse Response
IServer *pServer Server
Returns:
===================================================================*/
CScriptingContext::CScriptingContext
(
IApplicationObject *pAppln,
ISessionObject *pSession,
IRequest *pRequest,
IResponse *pResponse,
IServer *pServer
)
: m_cRef(1),
m_pAppln(pAppln), m_pSession(pSession),
m_pRequest(pRequest), m_pResponse(pResponse), m_pServer(pServer),
m_ImpISuppErr(this, NULL, IID_IScriptingContext)
{
CDispatch::Init(IID_IScriptingContext);
// AddRef Intrinsics -- they are now true COM objects
if (m_pAppln)
m_pAppln->AddRef();
if (m_pSession)
m_pSession->AddRef();
if (m_pRequest)
m_pRequest->AddRef();
if (m_pResponse)
m_pResponse->AddRef();
if (m_pServer)
m_pServer->AddRef();
}
/*===================================================================
CScriptingContext::~CScriptingContext
CScriptingContext destructor
Parameters:
Returns:
===================================================================*/
CScriptingContext::~CScriptingContext()
{
Assert(m_cRef == 0);
// Release Intrinsics
if (m_pAppln)
m_pAppln->Release();
if (m_pSession)
m_pSession->Release();
if (m_pRequest)
m_pRequest->Release();
if (m_pResponse)
m_pResponse->Release();
if (m_pServer)
m_pServer->Release();
}
/*===================================================================
IScriptingContext Interface Methods
CScriptingContext::Application
CScriptingContext::Session
CScriptingContext::Request
CScriptingContext::Response
CScriptingContext::Server
Parameters:
[out] Intrinsic object pointer
Returns:
HRESULT
===================================================================*/
STDMETHODIMP CScriptingContext::get_Request(IRequest **ppRequest)
{
if (m_pRequest)
{
m_pRequest->AddRef();
*ppRequest = m_pRequest;
return S_OK;
}
else
{
*ppRequest = NULL;
return TYPE_E_ELEMENTNOTFOUND;
}
}
STDMETHODIMP CScriptingContext::get_Response(IResponse **ppResponse)
{
if (m_pResponse)
{
m_pResponse->AddRef();
*ppResponse = m_pResponse;
return S_OK;
}
else
{
*ppResponse = m_pResponse;
return TYPE_E_ELEMENTNOTFOUND;
}
}
STDMETHODIMP CScriptingContext::get_Server(IServer **ppServer)
{
if (m_pServer)
{
m_pServer->AddRef();
*ppServer = m_pServer;
return S_OK;
}
else
{
*ppServer = NULL;
return TYPE_E_ELEMENTNOTFOUND;
}
}
STDMETHODIMP CScriptingContext::get_Session(ISessionObject **ppSession)
{
if (m_pSession)
{
m_pSession->AddRef();
*ppSession = m_pSession;
return S_OK;
}
else
{
*ppSession = NULL;
return TYPE_E_ELEMENTNOTFOUND;
}
}
STDMETHODIMP CScriptingContext::get_Application(IApplicationObject **ppAppln)
{
if (m_pAppln)
{
m_pAppln->AddRef();
*ppAppln = m_pAppln;
return S_OK;
}
else
{
*ppAppln = NULL;
return TYPE_E_ELEMENTNOTFOUND;
}
}
/*===================================================================
IUnknown Interface Methods
CScriptingContext::QueryInterface
CScriptingContext::AddRef
CScriptingContext::Release
===================================================================*/
STDMETHODIMP CScriptingContext::QueryInterface
(
REFIID riid,
PPVOID ppv
)
{
if (riid == IID_IUnknown ||
riid == IID_IDispatch ||
riid == IID_IScriptingContext)
{
AddRef();
*ppv = this;
}
else if (riid == IID_IRequest)
{
if (FAILED(get_Request((IRequest **)ppv)))
return E_NOINTERFACE;
}
else if (riid == IID_IResponse)
{
if (FAILED(get_Response((IResponse **)ppv)))
return E_NOINTERFACE;
}
else if (riid == IID_IServer)
{
if (FAILED(get_Server((IServer **)ppv)))
return E_NOINTERFACE;
}
else if (riid == IID_ISessionObject)
{
if (FAILED(get_Session((ISessionObject **)ppv)))
return E_NOINTERFACE;
}
else if (riid == IID_IApplicationObject)
{
if (FAILED(get_Application((IApplicationObject **)ppv)))
return E_NOINTERFACE;
}
else if (riid == IID_ISupportErrorInfo)
{
m_ImpISuppErr.AddRef();
*ppv = &m_ImpISuppErr;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
STDMETHODIMP_(ULONG) CScriptingContext::AddRef()
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CScriptingContext::Release()
{
if (--m_cRef)
return m_cRef;
delete this;
return 0;
}