2025-04-27 07:49:33 -04:00

496 lines
12 KiB
C++

//***************************************************************************/
//
// WbemQualSet.CPP
//
// Purpose: Implementation of IWbemQualifierSet interface in
// CWbemQualifierSet class
//
// Copyright (c)1997-2000 Microsoft Corporation, All Rights Reserved
//
//***************************************************************************/
#include <precomp.h>
#include <wmi2xsd.h>
#include "wbemqualset.h"
//*********************************************************************************************
// CPropRoot Class implementation
//*********************************************************************************************
////////////////////////////////////////////////////////////////////////////////////////
//
// Constructor
//
////////////////////////////////////////////////////////////////////////////////////////
CPropRoot::CPropRoot()
{
m_pszName = NULL;
m_lFlavor = 0;
m_cimType = 0;
m_lFlags = WBEM_FLAVOR_ORIGIN_LOCAL;
VariantInit(&m_vValue);
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Destructor
//
////////////////////////////////////////////////////////////////////////////////////////
CPropRoot::~CPropRoot()
{
VariantClear(&m_vValue);
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to set the name of the qualifier
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CPropRoot::SetName(LPCWSTR szName)
{
m_pszName = (WCHAR *)szName;
return S_OK;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Set flags for the qualifier
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CPropRoot::SetFlags(LONG lFlags)
{
HRESULT hr = S_OK;
if(lFlags == WBEM_FLAVOR_ORIGIN_LOCAL || lFlags == WBEM_FLAVOR_ORIGIN_PROPAGATED)
{
m_lFlags = lFlags;
}
else
{
hr = WBEM_E_INVALID_PARAMETER;
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Set Qualifier flavor
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CPropRoot::SetFlavor(LONG lFlavor)
{
m_lFlavor = lFlavor;
return S_OK;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Set qualifier Value
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CPropRoot::SetValue(VARIANT *pVal)
{
HRESULT hr = S_OK;
VariantClear(&m_vValue);
if(pVal)
{
hr = VariantCopy(&m_vValue,pVal);
}
if(SUCCEEDED(hr))
{
// FIXX m_cimType = GetCIMType(pVal->vt);
}
return hr;
}
//*********************************************************************************************
// End of CPropRoot Class implementation
//*********************************************************************************************
//*********************************************************************************************
// CWbemQualifierSet Class implementation
//*********************************************************************************************
////////////////////////////////////////////////////////////////////////////////////////
//
// Constructor
//
////////////////////////////////////////////////////////////////////////////////////////
CWbemQualifierSet::CWbemQualifierSet()
: m_Enum(QUALIFIERS_ENUM)
{
m_cRef = 0;
InterlockedIncrement(&g_cObj);
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Destructor
//
////////////////////////////////////////////////////////////////////////////////////////
CWbemQualifierSet::~CWbemQualifierSet()
{
InterlockedDecrement(&g_cObj);
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to initialize the object
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::FInit()
{
HRESULT hr = S_OK;
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// QueryInterface
//
////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CWbemQualifierSet::QueryInterface(REFIID riid, LPVOID* ppv)
{
HRESULT hr = E_NOINTERFACE;
*ppv=NULL;
if (IID_IUnknown==riid)
*ppv = reinterpret_cast<IUnknown*>(this);
else if (IID_IWbemQualifierSet==riid)
*ppv = reinterpret_cast<IWbemQualifierSet *>(this);
if (NULL!=*ppv)
{
((LPUNKNOWN)*ppv)->AddRef();
hr = NOERROR;
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// AddRef
//
////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CWbemQualifierSet::AddRef(void)
{
return InterlockedIncrement(&m_cRef);
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Release
//
////////////////////////////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CWbemQualifierSet::Release(void)
{
if(InterlockedDecrement(&m_cRef) == 0)
{
delete this;
return 0;
}
return m_cRef;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to fetch a qualifier
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::Get( LPCWSTR wszName,
long lFlags,
VARIANT *pVal,
long *plFlavor)
{
HRESULT hr = S_OK;
if(wszName && lFlags != 0 )
{
CHashElement *pQualifier = NULL;
hr = m_Enum.Get(wszName,lFlags,pQualifier);
if(pQualifier && SUCCEEDED(hr))
{
if(SUCCEEDED(hr))
{
hr = GetQualifier((CQualifier *)pQualifier,pVal,plFlavor);
}
}
else
{
hr = WBEM_E_NOT_FOUND;
}
}
else
{
hr = WBEM_E_INVALID_PARAMETER;
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to put a value to qualifier or to add a new qualifier
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::Put(LPCWSTR wszName,
VARIANT *pVal,
long lFlavor)
{
HRESULT hr = S_OK;
BOOL bNew = FALSE;
if(FAILED(IsValidFlavor(lFlavor)) ||
wszName == NULL ||
(wszName != NULL && wcslen(wszName) == 0))
{
hr = WBEM_E_INVALID_PARAMETER;
}
else
{
CHashElement *pTemp = NULL;
CQualifier *pQualifier = NULL;
hr = m_Enum.Get(wszName,0,pTemp);
// if qualifier is not present then add a new qualifier
if(!pTemp)
{
if(IsValidName((WCHAR *)wszName))
{
hr = AddQualifer(wszName,pVal,lFlavor);
}
else
{
hr = WBEM_E_INVALID_PARAMETER;
}
}
else
{
pQualifier = (CQualifier *)pTemp;
if(SUCCEEDED(hr = pQualifier->SetValue(pVal)))
{
hr = pQualifier->SetFlavor(lFlavor);
}
}
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to delete an existing qualifier
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::Delete(LPCWSTR wszName)
{
HRESULT hr = WBEM_E_INVALID_PARAMETER;
if(wszName)
{
hr = m_Enum.RemoveItem((WCHAR *)wszName);
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to get names of all the qualifiers in the qualifier set
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::GetNames(long lFlags,SAFEARRAY * *pNames)
{
HRESULT hr = WBEM_E_INVALID_PARAMETER;
if(ISValidEnumFlags(lFlags))
{
hr = S_OK;
}
if(pNames && SUCCEEDED(hr))
{
hr = m_Enum.GetNames(lFlags,pNames);
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to set begin enumeration on the qualifier set
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::BeginEnumeration(long lFlags)
{
HRESULT hr = WBEM_E_INVALID_PARAMETER;
if(ISValidEnumFlags(lFlags))
{
hr = m_Enum.BeginEnumeration(lFlags);
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to get the next qualifier in the qualifier set
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::Next(long lFlags,
BSTR *pstrName,
VARIANT *pVal,
long *plFlavor)
{
HRESULT hr = S_OK;
if(lFlags != 0)
{
hr = WBEM_E_INVALID_PARAMETER;
}
else
{
// Get the next qualifier
CHashElement *pQualifier = NULL;
hr = m_Enum.Next(lFlags,pstrName,pQualifier);
if(pQualifier && SUCCEEDED(hr))
{
hr = GetQualifier((CQualifier *)pQualifier,pVal,plFlavor);
if(FAILED(hr))
{
SAFE_FREE_SYSSTRING(*pstrName);
}
}
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Function to end the qualifier enumeration
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::EndEnumeration(void)
{
return m_Enum.EndEnumeration();
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Gets a qualifier
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::GetQualifier(CQualifier *pQualifier ,VARIANT *pVal,long *plFlavor)
{
HRESULT hr = S_OK;
if(pVal)
{
hr = VariantCopy(pVal,pQualifier->GetValue());
}
if(plFlavor)
{
*plFlavor = pQualifier->GetFlavor();
}
if(FAILED(hr) && pVal)
{
VariantClear(pVal);
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Adds a qualilfer to the linked list
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::AddQualifer(LPCWSTR wszName, VARIANT *pVal,long lFlavor , LONG lFlags)
{
HRESULT hr = WBEM_E_OUT_OF_MEMORY;
CQualifier * pQualifier = new CQualifier;
WCHAR *pszNameToAdd = new WCHAR[wcslen(wszName) + 1 ];
if(pszNameToAdd)
{
wcscpy(pszNameToAdd,wszName);
}
if(pQualifier && pszNameToAdd)
{
hr = pQualifier->SetName(wszName);
}
if(SUCCEEDED(hr))
{
hr = pQualifier->SetValue(pVal);
}
if(SUCCEEDED(hr))
{
hr = pQualifier->SetFlavor(lFlavor);
}
if(SUCCEEDED(hr))
{
hr = pQualifier->SetFlags(lFlags);
}
int nIndex = 0;
if(SUCCEEDED(hr))
{
hr = m_Enum.AddItem(pszNameToAdd,pQualifier);
}
if(FAILED(hr))
{
SAFE_DELETE_PTR(pQualifier);
SAFE_DELETE_PTR(pszNameToAdd);
}
return hr;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Checks if a given qualifier flavor is valid
//
////////////////////////////////////////////////////////////////////////////////////////
HRESULT CWbemQualifierSet::IsValidFlavor(LONG lFlavor)
{
LONG lTempFlavor = WBEM_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS ||
WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE ||
WBEM_FLAVOR_NOT_OVERRIDABLE ||
WBEM_FLAVOR_OVERRIDABLE ||
WBEM_FLAVOR_AMENDED;
return (lFlavor | ~lTempFlavor) ? E_FAIL : S_OK;
}
////////////////////////////////////////////////////////////////////////////////////////
//
// Checks if the enum flags are valid
//
////////////////////////////////////////////////////////////////////////////////////////
BOOL CWbemQualifierSet::ISValidEnumFlags(LONG lFlags)
{
return (lFlags == 0 || lFlags == WBEM_FLAG_LOCAL_ONLY || lFlags == WBEM_FLAG_PROPAGATED_ONLY);
}
//*********************************************************************************************
// End of CWbemQualifierSet Class implementation
//*********************************************************************************************