|
|
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMIOLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// IDBProperties and IDBInfo interface implementations
//
//////////////////////////////////////////////////////////////////////////////////////////////////
#include "headers.h"
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Returns information about the different properties that can be set on the provider
//
// HRESULT
// S_OK The method succeeded
// E_INVALIDARG pcPropertyInfo or prgPropertyInfo was NULL
// E_OUTOFMEMORY Out of memory
//
//////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImplIDBBinderProperties::GetPropertyInfo ( ULONG cPropertySets, // IN Number of properties being asked about
const DBPROPIDSET rgPropertySets[], // IN Array of cPropertySets properties about which to return information
ULONG* pcPropertyInfoSets, // OUT Number of properties for which information is being returned
DBPROPINFOSET** prgPropertyInfoSets,// OUT Buffer containing default values returned
WCHAR** ppDescBuffer // OUT Buffer containing property descriptions
) { assert( m_pObj ); assert( m_pObj->m_pUtilProp ); HRESULT hr = S_OK; CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(BINDER->GetCriticalSection());
// Clear ErrorInfo
g_pCError->ClearErrorInfo();
//=====================================================================================
// just pass this call on to the utility object that manages our properties
//=====================================================================================
hr = m_pObj->m_pUtilProp->GetPropertyInfo( m_pObj->m_fDSOInitialized, cPropertySets, rgPropertySets, pcPropertyInfoSets, prgPropertyInfoSets, ppDescBuffer);
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBBinderProperties);
CATCH_BLOCK_HRESULT(hr,L"IDBBinderProperties::GetPropertyInfo"); return hr; }
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Returns current settings of all properties of the required property set
//
// HRESULT
// S_OK The method succeeded
// E_INVALIDARG pcProperties or prgPropertyInfo was NULL
// E_OUTOFMEMORY Out of memory
//
//////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImplIDBBinderProperties::GetProperties ( ULONG cPropertySets, // IN count of restiction guids
const DBPROPIDSET rgPropertySets[], // IN restriction guids
ULONG* pcProperties, // OUT count of properties returned
DBPROPSET** prgProperties // OUT property information returned
) { DWORD dwBitMask = GetBitMask(rgPropertySets[0].guidPropertySet);
assert( m_pObj ); assert( m_pObj->m_pUtilProp ); HRESULT hr = S_OK; CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(BINDER->GetCriticalSection());
// Clear ErrorInfo
g_pCError->ClearErrorInfo();
//=================================================================================
// Check Arguments
//=================================================================================
hr = m_pObj->m_pUtilProp->GetPropertiesArgChk(dwBitMask, cPropertySets, rgPropertySets, pcProperties, prgProperties,m_pObj->m_fDSOInitialized); if ( !FAILED(hr) ){
//=============================================================================
// Just pass this call on to the utility object that manages our properties
//=============================================================================
hr = m_pObj->m_pUtilProp->GetProperties(dwBitMask,cPropertySets, rgPropertySets,pcProperties, prgProperties ); } hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBBinderProperties);
CATCH_BLOCK_HRESULT(hr,L"IDBBinderProperties::GetProperties"); return hr; }
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Set properties on the provider
//
// HRESULT
// S_OK | The method succeeded
// E_INVALIDARG | cProperties was not equal to 0 and rgProperties was NULL
//
//////////////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CImplIDBBinderProperties::SetProperties ( ULONG cProperties,DBPROPSET rgProperties[] ) { HRESULT hr = E_FAIL; DWORD dwBitMask = GetBitMask(rgProperties[0].guidPropertySet); CSetStructuredExceptionHandler seh;
assert( m_pObj ); assert( m_pObj->m_pUtilProp );
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(BINDER->GetCriticalSection());
// Clear ErrorInfo
g_pCError->ClearErrorInfo();
//===================================================================================
// Quick return if the Count of Properties is 0
//===================================================================================
if( cProperties == 0 ){ hr = S_OK ; }
//===================================================================================
// Check Arguments for use by properties
//===================================================================================
hr = m_pObj->m_pUtilProp->SetPropertiesArgChk(cProperties, rgProperties,m_pObj->m_fDSOInitialized); if( !FAILED(hr) ){
//===================================================================================
// just pass this call on to the utility object that manages our properties
//===================================================================================
hr = m_pObj->m_pUtilProp->SetProperties(dwBitMask,cProperties, rgProperties); }
hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBBinderProperties);
CATCH_BLOCK_HRESULT(hr,L"IDBBinderProperties::SetProperties"); return hr; }
HRESULT CImplIDBBinderProperties::Reset() { HRESULT hr = S_OK; CSetStructuredExceptionHandler seh;
TRY_BLOCK;
// Serialize the object
CAutoBlock cab(BINDER->GetCriticalSection());
// Clear ErrorInfo
g_pCError->ClearErrorInfo();
hr = m_pObj->m_pUtilProp->ResetProperties(); hr = hr == S_OK ? hr :g_pCError->PostHResult(hr,&IID_IDBBinderProperties);
CATCH_BLOCK_HRESULT(hr,L"IDBBinderProperties::Reset"); return hr; }
DWORD CImplIDBBinderProperties::GetBitMask(REFGUID rguid) { DWORD dwRet = 0; if( rguid == DBPROPSET_COLUMN || rguid == DBPROPSET_WMIOLEDB_COLUMN) dwRet = PROPSET_ROWSET; else if( rguid == DBPROPSET_DATASOURCE) dwRet = PROPSET_DSO ; else if( rguid == DBPROPSET_DATASOURCEINFO) dwRet = PROPSET_DSO; else if( rguid == DBPROPSET_DBINIT || rguid == DBPROPSET_WMIOLEDB_DBINIT) dwRet = PROPSET_DSOINIT; else if( rguid == DBPROPSET_ROWSET || rguid == DBPROPSET_WMIOLEDB_ROWSET) dwRet = PROPSET_ROWSET; else if( rguid == DBPROPSET_SESSION) dwRet = PROPSET_SESSION;
return dwRet; }
|