244 lines
7.5 KiB
C++
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;
|
||
|
}
|