Source code of Windows XP (NT5)
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.
|
|
///////////////////////////////////////////////////////////////////////////////////
//
// 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; }
|