windows-nt/Source/XPSP1/NT/admin/wmi/wbem/adapters/oledb/tranoptions.cpp
2020-09-26 16:20:57 +08:00

244 lines
7.5 KiB
C++

///////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// CTranOptions object implementation & ITransactionOptions interface implementation
//
//
///////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Constructor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CTranOptions::CTranOptions(IUnknown *pUnkOuter) : CBaseObj(BOT_TXNOPTIONS,pUnkOuter)
{
m_pITransOptions = NULL;
m_xactOptions.ulTimeout = 0;
memset(m_xactOptions.szDescription,0,MAX_TRAN_DESC * sizeof(unsigned char));
InterlockedIncrement(&g_cObj);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Destructor
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CTranOptions::~CTranOptions()
{
SAFE_DELETE_PTR(m_pITransOptions);
SAFE_DELETE_PTR(m_pISupportErrorInfo);
InterlockedDecrement(&g_cObj);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IUnknown method AddRef
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CTranOptions::AddRef(void)
{
return InterlockedIncrement((long*)&m_cRef);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// IUnknown method Release
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CTranOptions::Release(void)
{
if (!InterlockedDecrement((long*)&m_cRef))
{
delete this;
return 0;
}
return m_cRef;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// QueryInterface
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTranOptions::QueryInterface(REFIID riid, LPVOID *ppv)
{
HRESULT hr = S_OK;
//======================================================
// Check parameters, if not valid return
//======================================================
if (NULL == ppv)
{
hr = E_INVALIDARG ;
}
else
{
//======================================================
// Place NULL in *ppv in case of failure
//======================================================
*ppv = NULL;
if (riid == IID_IUnknown)
{
*ppv = (LPVOID) this;
}
else if (riid == IID_ITransactionOptions)
{
*ppv = (LPVOID)m_pITransOptions;
}
else if (riid == IID_ISupportErrorInfo)
{
*ppv = (LPVOID)m_pISupportErrorInfo;
}
//======================================================
// If we're going to return an interface, AddRef first
//======================================================
if (*ppv)
{
((LPUNKNOWN) *ppv)->AddRef();
hr = S_OK ;
}
else
{
hr = E_NOINTERFACE;
}
}
return hr;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Initilization function for the object
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CTranOptions::FInit()
{
HRESULT hr = S_OK;
m_pITransOptions = new CImpITransactionOptions(this);
m_pISupportErrorInfo = new CImpISupportErrorInfo(this);
if(!m_pITransOptions || !m_pISupportErrorInfo)
{
hr = E_OUTOFMEMORY;
}
if(SUCCEEDED(hr))
{
hr = AddInterfacesForISupportErrorInfo();
}
return hr;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to add interfaces to ISupportErrorInfo interface
/////////////////////////////////////////////////////////////////////////////////////////////////////
HRESULT CTranOptions::AddInterfacesForISupportErrorInfo()
{
HRESULT hr = S_OK;
hr = m_pISupportErrorInfo->AddInterfaceID(IID_ITransactionOptions);
return hr;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function to set the transactions options
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void CTranOptions::SetOptions(XACTOPT *pOpt)
{
m_xactOptions.ulTimeout = pOpt->ulTimeout;
strcpy(m_xactOptions.szDescription,pOpt->szDescription);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Function which returns pointer to transaction options structure pointer
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
XACTOPT *CTranOptions::GetOptions()
{
return &m_xactOptions;
}
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
// CImpITransactionOptions class implementaions - ie ITransactionOptions interface implementation
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Set transactions options
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL a provider specific error occured
// E_INVALIDARG pOptions is NULL
//
/////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpITransactionOptions::SetOptions(XACTOPT * pOptions)
{
HRESULT hr = E_INVALIDARG;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Seriliaze the object
CAutoBlock cab(m_pObj->GetCriticalSection());
// Clear Error information
g_pCError->ClearErrorInfo();
if(pOptions)
{
m_pObj->SetOptions(pOptions);
hr = S_OK;
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITransactionOptions);
CATCH_BLOCK_HRESULT(hr,L"ITransactionOptions::SetOptions");
return hr;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//
// Get the current transactions options
//
// Returns one of the following values:
// S_OK Method Succeeded
// E_FAIL a provider specific error occured
// E_INVALIDARG pOptions is NULL
//
/////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImpITransactionOptions::GetOptions(XACTOPT * pOptions)
{
HRESULT hr = E_INVALIDARG;
CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Seriliaze the object
CAutoBlock cab(m_pObj->GetCriticalSection());
// Clear Error information
g_pCError->ClearErrorInfo();
if(pOptions)
{
XACTOPT *pOptTemp = m_pObj->GetOptions();
pOptions->ulTimeout = pOptTemp->ulTimeout;
strcpy(pOptions->szDescription,pOptTemp->szDescription);
hr = S_OK;
}
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_ITransactionOptions);
CATCH_BLOCK_HRESULT(hr,L"ITransactionOptions::SetOptions");
return hr;
}