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

140 lines
3.1 KiB
C++

// txnobj.cpp : Implementation of CASPObjectContext
#include "stdafx.h"
#include "txnscrpt.h"
#include "txnobj.h"
#include <hostinfo.h>
#include <scrpteng.h>
/////////////////////////////////////////////////////////////////////////////
// CASPObjectContext
HRESULT CASPObjectContext::Activate()
{
HRESULT hr = GetObjectContext(&m_spObjectContext);
if (SUCCEEDED(hr))
return S_OK;
return hr;
}
BOOL CASPObjectContext::CanBePooled()
{
return FALSE;
}
void CASPObjectContext::Deactivate()
{
m_spObjectContext.Release();
}
STDMETHODIMP CASPObjectContext::Call
(
#ifdef _WIN64
// Win64 fix -- use UINT64 instead of LONG_PTR since LONG_PTR is broken for Win64 1/21/2000
UINT64 pvScriptEngine /*CScriptEngine*/,
#else
LONG_PTR pvScriptEngine /*CScriptEngine*/,
#endif
LPCOLESTR strEntryPoint,
// BUGBUG - ASP uses this BOOLB type that resolves to a unsigned char. I changed things
// to boolean for simplicity, but this requires some strange casts.
boolean *pfAborted
)
{
HRESULT hr = NOERROR;
CScriptEngine *pScriptEngine = (CScriptEngine *)pvScriptEngine;
m_fAborted = FALSE;
hr = pScriptEngine->Call(strEntryPoint);
// If the script timed out or there was an unhandled error, then autoabort
if (SUCCEEDED(hr) && (pScriptEngine->FScriptTimedOut() || pScriptEngine->FScriptHadError()))
{
hr = SetAbort();
m_fAborted = TRUE;
}
// If the script author did not do an explicit SetComplete or SetAbort
// then do a SetComplete here so Viper will return the transaction
// completion status to the caller
if (SUCCEEDED(hr) && !m_fAborted)
{
hr = SetComplete();
}
*pfAborted = (boolean)m_fAborted;
return hr;
}
STDMETHODIMP CASPObjectContext::ResetScript
(
#ifdef _WIN64
// Win64 fix -- use UINT64 instead of LONG_PTR since LONG_PTR is broken for Win64 1/21/2000
UINT64 pvScriptEngine /*CScriptEngine*/
#else
LONG_PTR pvScriptEngine /*CScriptEngine*/
#endif
)
{
HRESULT hr = NOERROR;
CScriptEngine *pScriptEngine = (CScriptEngine *)pvScriptEngine;
hr = pScriptEngine->ResetScript();
return hr;
}
STDMETHODIMP CASPObjectContext::SetComplete()
{
HRESULT hr = E_NOTIMPL;
IObjectContext * pContext = NULL;
hr = GetObjectContext(&pContext);
if( SUCCEEDED(hr) )
{
hr = pContext->SetComplete();
pContext->Release();
m_fAborted = FALSE; // If it was aborted, its not any more
}
return hr;
}
STDMETHODIMP CASPObjectContext::SetAbort()
{
IObjectContext * pContext = NULL;
HRESULT hr = NOERROR;
hr = GetObjectContext(&pContext);
if( SUCCEEDED(hr) )
{
hr = pContext->SetAbort();
pContext->Release();
m_fAborted = TRUE; // transaction was esplicitly aborted
}
return hr;
}
STDMETHODIMP CASPObjectContext::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_IASPObjectContextCustom
, &IID_IASPObjectContext
, &IID_IObjectControl
, &IID_IDispatch
};
for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}