|
|
//***************************************************************************
//
// Copyright (c) 1998-2000 Microsoft Corporation
//
// OBJOBJ.CPP
//
// alanbos 15-Aug-96 Created.
//
// Defines the implementation of ISWbemObjectPath for the ISWbemObjectEx
// interface
//
//***************************************************************************
#include "precomp.h"
//***************************************************************************
//
// CSWbemObjectObjectPath::CSWbemObjectObjectPath
//
// DESCRIPTION:
//
// Constructor.
//
//***************************************************************************
CSWbemObjectObjectPath::CSWbemObjectObjectPath( CSWbemServices *pSWbemServices, CSWbemObject *pSObject) : m_pIWbemClassObject (NULL), m_pSWbemServices (pSWbemServices), m_pSite (NULL) { InterlockedIncrement(&g_cObj);
if (pSObject) { m_pIWbemClassObject = pSObject->GetIWbemClassObject (); m_pSite = new CWbemObjectSite (pSObject); }
if (m_pSWbemServices) m_pSWbemServices->AddRef ();
m_pSecurity = new CSWbemObjectObjectPathSecurity (pSWbemServices);
m_Dispatch.SetObj (this, IID_ISWbemObjectPath, CLSID_SWbemObjectPath, L"SWbemObjectPath"); m_cRef=0; }
//***************************************************************************
//
// CSWbemObjectObjectPath::~CSWbemObjectObjectPath
//
// DESCRIPTION:
//
// Destructor.
//
//***************************************************************************
CSWbemObjectObjectPath::~CSWbemObjectObjectPath(void) { if (m_pSWbemServices) { m_pSWbemServices->Release (); m_pSWbemServices = NULL; }
if (m_pIWbemClassObject) { m_pIWbemClassObject->Release (); m_pIWbemClassObject = NULL; }
if (m_pSite) { m_pSite->Release (); m_pSite = NULL; }
if (m_pSecurity) { m_pSecurity->Release (); m_pSecurity = NULL; }
InterlockedDecrement(&g_cObj); }
//***************************************************************************
// HRESULT CSWbemObjectPath::QueryInterface
// long CSWbemObjectPath::AddRef
// long CSWbemObjectPath::Release
//
// DESCRIPTION:
//
// Standard Com IUNKNOWN functions.
//
//***************************************************************************
STDMETHODIMP CSWbemObjectObjectPath::QueryInterface (
IN REFIID riid, OUT LPVOID *ppv ) { *ppv=NULL;
if (IID_IUnknown==riid) *ppv = reinterpret_cast<IUnknown*>(this); else if (IID_ISWbemObjectPath==riid) *ppv = (ISWbemObjectPath *)this; else if (IID_IDispatch==riid) *ppv = (IDispatch *)this; else if (IID_ISupportErrorInfo==riid) *ppv = (ISupportErrorInfo *)this; else if (IID_IProvideClassInfo==riid) *ppv = (IProvideClassInfo *)this;
if (NULL!=*ppv) { ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; }
return ResultFromScode(E_NOINTERFACE); }
STDMETHODIMP_(ULONG) CSWbemObjectObjectPath::AddRef(void) { InterlockedIncrement(&m_cRef); return m_cRef; }
STDMETHODIMP_(ULONG) CSWbemObjectObjectPath::Release(void) { InterlockedDecrement(&m_cRef); if (0L!=m_cRef) return m_cRef; delete this; return 0; }
//***************************************************************************
// HRESULT CSWbemObjectObjectPath::InterfaceSupportsErrorInfo
//
// DESCRIPTION:
//
// Standard Com ISupportErrorInfo functions.
//
//***************************************************************************
STDMETHODIMP CSWbemObjectObjectPath::InterfaceSupportsErrorInfo (IN REFIID riid) { return (IID_ISWbemObjectPath == riid) ? S_OK : S_FALSE; }
// Methods of ISWbemObjectPath
STDMETHODIMP CSWbemObjectObjectPath::get_RelPath( /* [retval][out] */ BSTR __RPC_FAR *value) { return GetStrVal (value, WBEMS_SP_RELPATH); }
STDMETHODIMP CSWbemObjectObjectPath::get_Path( /* [retval][out] */ BSTR __RPC_FAR *value) { return GetStrVal (value, WBEMS_SP_PATH); }
STDMETHODIMP CSWbemObjectObjectPath::get_Server( /* [retval][out] */ BSTR __RPC_FAR *value) { return GetStrVal (value, WBEMS_SP_SERVER); }
STDMETHODIMP CSWbemObjectObjectPath::get_Namespace( /* [retval][out] */ BSTR __RPC_FAR *value) { return GetStrVal (value, WBEMS_SP_NAMESPACE); } STDMETHODIMP CSWbemObjectObjectPath::get_Class( /* [retval][out] */ BSTR __RPC_FAR *value) { return GetStrVal (value, WBEMS_SP_CLASS); } STDMETHODIMP CSWbemObjectObjectPath::GetStrVal ( BSTR *value, LPWSTR name) { HRESULT hr = WBEM_E_FAILED ;
ResetLastErrors ();
if (NULL == value) hr = WBEM_E_INVALID_PARAMETER; else { *value = NULL;
if ( m_pIWbemClassObject ) { VARIANT var; VariantInit (&var); if (WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (name, 0, &var, NULL, NULL)) { if (VT_BSTR == var.vt) { *value = SysAllocString (var.bstrVal); hr = WBEM_S_NO_ERROR; } else if (VT_NULL == var.vt) { *value = SysAllocString (OLESTR("")); hr = WBEM_S_NO_ERROR; } }
VariantClear (&var);
if (NULL == *value) *value = SysAllocString (OLESTR(""));
} }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::get_IsClass( /* [retval][out] */ VARIANT_BOOL __RPC_FAR *value) { HRESULT hr = WBEM_E_FAILED ;
ResetLastErrors ();
if (NULL == value) hr = WBEM_E_INVALID_PARAMETER; else { *value = true;
if (m_pIWbemClassObject) { VARIANT var; VariantInit (&var); BSTR genus = SysAllocString (WBEMS_SP_GENUS); if (WBEM_S_NO_ERROR == m_pIWbemClassObject->Get (genus, 0, &var, NULL, NULL)) { *value = (var.lVal == WBEM_GENUS_CLASS) ? VARIANT_TRUE : VARIANT_FALSE; hr = WBEM_S_NO_ERROR; }
VariantClear (&var); SysFreeString (genus); } }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::get_IsSingleton( /* [retval][out] */ VARIANT_BOOL __RPC_FAR *value) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == value) hr = WBEM_E_INVALID_PARAMETER; else { BSTR path = NULL; *value = false;
if (WBEM_S_NO_ERROR == get_Path (&path)) { CWbemPathCracker pathCracker (path); *value = pathCracker.IsSingleton (); hr = WBEM_S_NO_ERROR;
SysFreeString (path); } }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::get_DisplayName( /* [retval][out] */ BSTR __RPC_FAR *value) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == value) hr = WBEM_E_INVALID_PARAMETER; else { BSTR path = NULL;
if (WBEM_S_NO_ERROR == get_Path (&path)) { wchar_t *securityStr = NULL; wchar_t *localeStr = NULL; if (m_pSWbemServices) { CSWbemSecurity *pSecurity = m_pSWbemServices->GetSecurityInfo ();
if (pSecurity) { BSTR bsAuthority = SysAllocString (pSecurity->GetAuthority ()); enum WbemAuthenticationLevelEnum authnLevel; enum WbemImpersonationLevelEnum impLevel;
if (SUCCEEDED(pSecurity->get_AuthenticationLevel (&authnLevel)) && SUCCEEDED(pSecurity->get_ImpersonationLevel (&impLevel))) { CSWbemPrivilegeSet *pPrivilegeSet = pSecurity->GetPrivilegeSet ();
if (pPrivilegeSet) { securityStr = CWbemParseDN::GetSecurityString (true, authnLevel, true, impLevel, *pPrivilegeSet, bsAuthority); pPrivilegeSet->Release (); } }
SysFreeString (bsAuthority); pSecurity->Release (); }
localeStr = CWbemParseDN::GetLocaleString (m_pSWbemServices->GetLocale ()); }
size_t len = wcslen (path) + wcslen (WBEMS_PDN_SCHEME) + ((securityStr) ? wcslen (securityStr) : 0) + ((localeStr) ? wcslen (localeStr) : 0);
// If security or locale specified, and we have a path, then need a separator
if ( (securityStr || localeStr) && (0 < wcslen (path)) ) len += wcslen (WBEMS_EXCLAMATION);
OLECHAR *displayName = new OLECHAR [len + 1]; if (displayName) { wcscpy (displayName, WBEMS_PDN_SCHEME) ; if (securityStr) wcscat (displayName, securityStr);
if (localeStr) wcscat (displayName, localeStr);
if ( (securityStr || localeStr) && (0 < wcslen (path)) ) wcscat (displayName, WBEMS_EXCLAMATION);
wcscat (displayName, path) ; displayName [len] = NULL;
*value = SysAllocString (displayName); delete [] displayName ; hr = WBEM_S_NO_ERROR; } else hr = WBEM_E_OUT_OF_MEMORY; if (securityStr) delete [] securityStr;
if (localeStr) delete [] localeStr;
SysFreeString (path); } }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::get_ParentNamespace( /* [retval][out] */ BSTR __RPC_FAR *value) { HRESULT hr = WBEM_S_NO_ERROR;
ResetLastErrors ();
if (NULL == value) hr = WBEM_E_INVALID_PARAMETER; else { BSTR path = NULL; *value = NULL;
if (WBEM_S_NO_ERROR == get_Path (&path)) { CWbemPathCracker pathCracker (path); CComBSTR bsNsPath;
if (pathCracker.GetNamespacePath (bsNsPath, true)) { *value = bsNsPath.Detach (); hr = WBEM_S_NO_ERROR; } SysFreeString (path); }
if (NULL == *value) *value = SysAllocString (OLESTR("")); }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::put_Class( /* [in] */ BSTR __RPC_FAR value) { HRESULT hr = WBEM_E_FAILED ;
ResetLastErrors ();
if ( value && m_pIWbemClassObject ) { VARIANT var; VariantInit (&var); var.vt = VT_BSTR; var.bstrVal = SysAllocString (value); BSTR className = SysAllocString (WBEMS_SP_CLASS); hr = m_pIWbemClassObject->Put (className, 0, &var, NULL); VariantClear (&var); SysFreeString (className); }
if (FAILED(hr)) m_Dispatch.RaiseException (hr); else { // Propagate the change to the owning site
if (m_pSite) m_pSite->Update (); }
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::get_Keys( /* [out, retval] */ ISWbemNamedValueSet **objKeys) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == objKeys) hr = WBEM_E_INVALID_PARAMETER; else { *objKeys = NULL; BSTR bsPath = NULL; if (WBEM_S_NO_ERROR == get_Path (&bsPath)) { CWbemPathCracker *pCWbemPathCracker = new CWbemPathCracker (bsPath);
if (!pCWbemPathCracker) hr = WBEM_E_OUT_OF_MEMORY; else { CSWbemNamedValueSet *pCSWbemNamedValueSet = new CSWbemNamedValueSet (pCWbemPathCracker, false);
if (!pCSWbemNamedValueSet) hr = WBEM_E_OUT_OF_MEMORY; else if (SUCCEEDED(pCSWbemNamedValueSet->QueryInterface (IID_ISWbemNamedValueSet, (PPVOID) objKeys))) hr = WBEM_S_NO_ERROR; else delete pCSWbemNamedValueSet; } SysFreeString (bsPath); } }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr;
}
STDMETHODIMP CSWbemObjectObjectPath::get_Security_( /* [out, retval] */ ISWbemSecurity **objSecurity) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (objSecurity) { *objSecurity = m_pSecurity; m_pSecurity->AddRef (); hr = WBEM_S_NO_ERROR; }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
STDMETHODIMP CSWbemObjectObjectPath::get_Locale( /* [retval][out] */ BSTR __RPC_FAR *value) { HRESULT t_Result = WBEM_E_FAILED ;
ResetLastErrors ();
if ( value ) { if (m_pSWbemServices) *value = SysAllocString (m_pSWbemServices->GetLocale ()) ; else *value = SysAllocString (OLESTR(""));
t_Result = S_OK ; }
if (FAILED(t_Result)) m_Dispatch.RaiseException (t_Result);
return t_Result ; }
STDMETHODIMP CSWbemObjectObjectPath::get_Authority( /* [retval][out] */ BSTR __RPC_FAR *value) { HRESULT t_Result = WBEM_E_FAILED ;
ResetLastErrors ();
if ( value ) { if (m_pSecurity) *value = SysAllocString (m_pSecurity->GetAuthority ()) ; else *value = SysAllocString (OLESTR(""));
t_Result = S_OK ; }
if (FAILED(t_Result)) m_Dispatch.RaiseException (t_Result);
return t_Result ; }
// CSWbemObjectObjectPathSecurity methods
//***************************************************************************
//
// CSWbemObjectObjectPathSecurity::CSWbemObjectObjectPathSecurity
//
// DESTRUCTOR
//
//***************************************************************************
CSWbemObjectObjectPathSecurity::CSWbemObjectObjectPathSecurity ( CSWbemServices *pSWbemServices ) : m_pPrivilegeSet (NULL), m_bsAuthority (NULL) { m_Dispatch.SetObj (this, IID_ISWbemSecurity, CLSID_SWbemSecurity, L"SWbemSecurity"); m_cRef=1; InterlockedIncrement(&g_cObj);
if (pSWbemServices) { CSWbemSecurity *pSecurity = pSWbemServices->GetSecurityInfo ();
if (pSecurity) { // Set up authn and imp levels
pSecurity->get_AuthenticationLevel (&m_dwAuthnLevel); pSecurity->get_ImpersonationLevel (&m_dwImpLevel);
// Set up authority
m_bsAuthority = SysAllocString (pSecurity->GetAuthority ());
// Set up privileges
CSWbemPrivilegeSet *pPrivilegeSet = pSecurity->GetPrivilegeSet ();
if (pPrivilegeSet) { // Note we mark the privilege set as immutable
m_pPrivilegeSet = new CSWbemPrivilegeSet (*pPrivilegeSet, false); pPrivilegeSet->Release (); }
pSecurity->Release (); } } }
//***************************************************************************
//
// CSWbemObjectObjectPathSecurity::~CSWbemObjectObjectPathSecurity
//
// DESTRUCTOR
//
//***************************************************************************
CSWbemObjectObjectPathSecurity::~CSWbemObjectObjectPathSecurity (void) { InterlockedDecrement(&g_cObj);
if (m_pPrivilegeSet) { m_pPrivilegeSet->Release (); m_pPrivilegeSet = NULL; }
if (m_bsAuthority) { SysFreeString (m_bsAuthority); m_bsAuthority = NULL; } }
//***************************************************************************
// HRESULT CSWbemObjectObjectPathSecurity::QueryInterface
// long CSWbemObjectObjectPathSecurity::AddRef
// long CSWbemObjectObjectPathSecurity::Release
//
// DESCRIPTION:
//
// Standard Com IUNKNOWN functions.
//
//***************************************************************************
STDMETHODIMP CSWbemObjectObjectPathSecurity::QueryInterface (
IN REFIID riid, OUT LPVOID *ppv ) { *ppv=NULL;
if (IID_IUnknown==riid) *ppv = reinterpret_cast<IUnknown*>(this); else if (IID_ISWbemSecurity==riid) *ppv = (ISWbemSecurity *)this; else if (IID_IDispatch==riid) *ppv = (IDispatch *)this; else if (IID_ISupportErrorInfo==riid) *ppv = (ISupportErrorInfo *) this; else if (IID_IProvideClassInfo==riid) *ppv = (IProvideClassInfo *)this;
if (NULL!=*ppv) { ((LPUNKNOWN)*ppv)->AddRef(); return NOERROR; }
return ResultFromScode(E_NOINTERFACE); }
STDMETHODIMP_(ULONG) CSWbemObjectObjectPathSecurity::AddRef(void) { long l = InterlockedIncrement(&m_cRef); return l; }
STDMETHODIMP_(ULONG) CSWbemObjectObjectPathSecurity::Release(void) { long l = InterlockedDecrement(&m_cRef); if (0L!=l) return l; delete this; return 0; }
//***************************************************************************
// HRESULT CSWbemObjectObjectPathSecurity::InterfaceSupportsErrorInfo
//
// DESCRIPTION:
//
// Standard Com ISupportErrorInfo functions.
//
//***************************************************************************
STDMETHODIMP CSWbemObjectObjectPathSecurity::InterfaceSupportsErrorInfo (IN REFIID riid) { return (IID_ISWbemSecurity == riid) ? S_OK : S_FALSE; }
//***************************************************************************
//
// SCODE CSWbemObjectObjectPathSecurity::get_AuthenticationLevel
//
// DESCRIPTION:
//
// Retrieve the authentication level
//
// PARAMETERS:
//
// pAuthenticationLevel holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObjectObjectPathSecurity::get_AuthenticationLevel ( WbemAuthenticationLevelEnum *pAuthenticationLevel ) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == pAuthenticationLevel) hr = WBEM_E_INVALID_PARAMETER; else { *pAuthenticationLevel = m_dwAuthnLevel; hr = WBEM_S_NO_ERROR; }
if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
//***************************************************************************
//
// SCODE CSWbemObjectObjectPathSecurity::get_ImpersonationLevel
//
// DESCRIPTION:
//
// Retrieve the impersonation level
//
// PARAMETERS:
//
// pImpersonationLevel holds the value on return
//
// RETURN VALUES:
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObjectObjectPathSecurity::get_ImpersonationLevel ( WbemImpersonationLevelEnum *pImpersonationLevel ) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == pImpersonationLevel) hr = WBEM_E_INVALID_PARAMETER; else { *pImpersonationLevel = m_dwImpLevel; hr = WBEM_S_NO_ERROR; } if (FAILED(hr)) m_Dispatch.RaiseException (hr);
return hr; }
//***************************************************************************
//
// SCODE CSWbemObjectObjectPathSecurity::get_Privileges
//
// DESCRIPTION:
//
// Return the Privilege override set
//
// WBEM_S_NO_ERROR success
// WBEM_E_INVALID_PARAMETER bad input parameters
// WBEM_E_FAILED otherwise
//
//***************************************************************************
HRESULT CSWbemObjectObjectPathSecurity::get_Privileges ( ISWbemPrivilegeSet **ppPrivileges ) { HRESULT hr = WBEM_E_FAILED;
ResetLastErrors ();
if (NULL == ppPrivileges) hr = WBEM_E_INVALID_PARAMETER; { *ppPrivileges = NULL;
if (m_pPrivilegeSet) { if (SUCCEEDED (m_pPrivilegeSet->QueryInterface (IID_ISWbemPrivilegeSet, (PPVOID) ppPrivileges))) hr = WBEM_S_NO_ERROR; } } if (FAILED(hr)) m_Dispatch.RaiseException (hr); return hr; }
|