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

3361 lines
98 KiB
C++

//***************************************************************************
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// PARSE.CPP
//
// rajesh 3/25/2000 Created.
//
// Contains the functions for parsing XML Requests that conform to the CIM DTD or WMI (Nova and WHistler)
// DTDs
//
//***************************************************************************
#include <windows.h>
#include <httpext.h>
#include <mshtml.h>
#include <msxml.h>
#include <objbase.h>
#include <initguid.h>
#include <wbemcli.h>
#include "provtempl.h"
#include "common.h"
#include "strings.h"
#include "errors.h"
#include "wmixmlop.h"
#include "wmiconv.h"
#include "request.h"
#include "whistler.h"
#include "xmlhelp.h"
#include "parse.h"
// Forward declarations of parsers for smaller constructs
// These are static functions and are used only in this file
//============================================================
static BOOLEAN ParseMultiReq(IXMLDOMNodeList *pReqList, CCimHttpMultiMessage *pMultiRequest, BSTR strID, BOOLEAN bIsMpostRequest, BOOLEAN bIsMicrosoftWMIClient, WMI_XML_HTTP_VERSION iHttpVersion, DWORD dwNumSimpleRequests);
static CCimHttpMessage * ParseSimpleReq(IXMLDOMNode *pNode, BSTR strID, BOOLEAN bIsMpostRequest, BOOLEAN bIsMicrosoftWMIClient, WMI_XML_HTTP_VERSION iHttpVersion);
static CCimHttpMessage * ParseIMethodCall(IXMLDOMNode *pMethodNode, BSTR strID);
static CCimHttpMessage * ParseMethodCall(IXMLDOMNode *pMethodNode, BSTR strID);
HRESULT ParseLongArgument(IXMLDOMNode *pNode, long *plArgVal)
{
HRESULT hr = E_FAIL;
BSTR strStringVal = NULL;
if(SUCCEEDED(hr = pNode->get_text(&strStringVal)))
{
// Convert it to a long value
*plArgVal = (long) wcstol (strStringVal, NULL, 0);
SysFreeString(strStringVal);
}
return hr;
}
// Parse one key value
HRESULT ParseKeyValue(IXMLDOMNode *pNode, BSTR *ppszValue)
{
HRESULT result = E_FAIL;
BSTR strType = NULL;
*ppszValue = NULL;
// This is an optional attribute and the default is "string"
BOOLEAN isString = TRUE;
if(SUCCEEDED(GetBstrAttribute(pNode, VALUE_TYPE_ATTRIBUTE, &strType)))
{
if(_wcsicmp(strType, STRING_TYPE) != 0)
{
isString = FALSE;
SysFreeString(strType);
}
}
if(isString) // Escape the appropriate characters and enclose it in double-quotes
{
LPWSTR pszReturnValue = NULL;
BSTR strTemp = NULL;
if(SUCCEEDED(result = pNode->get_text(&strTemp)))
{
BSTR strEscapedTemp = NULL;
if(strEscapedTemp = EscapeSpecialCharacters(strTemp))
{
if(pszReturnValue = new WCHAR[wcslen(strEscapedTemp) + 3])
{
wcscpy(pszReturnValue, QUOTE_SIGN);
wcscat(pszReturnValue, strEscapedTemp);
wcscat(pszReturnValue, QUOTE_SIGN);
if(!(*ppszValue = SysAllocString(pszReturnValue)))
result = E_OUTOFMEMORY;
delete [] pszReturnValue;
}
else
result = E_OUTOFMEMORY;
SysFreeString(strEscapedTemp);
}
else
result = E_OUTOFMEMORY;
SysFreeString(strTemp);
}
}
else // BOOLEAN or Numeric
{
result = pNode->get_text(ppszValue);
}
return result;
}
// Parse one value The only difference between this and ParseKeyValue is that strings are not enclsed in quotes
HRESULT ParseValue(IXMLDOMNode *pNode, BSTR *ppszValue)
{
HRESULT result = E_FAIL;
BSTR strType = NULL;
*ppszValue = NULL;
BOOLEAN isString = FALSE;
if(SUCCEEDED(result = GetBstrAttribute(pNode, VALUE_TYPE_ATTRIBUTE, &strType)))
{
if(_wcsicmp(strType, STRING_TYPE) == 0) // Enclose it in double-quotes
isString = TRUE;
SysFreeString(strType);
}
else // It's a string by default
{
isString = TRUE;
}
if(isString) // Escape the appropriate characters and enclose it in double-quotes
{
LPWSTR pszReturnValue = NULL;
BSTR strTemp = NULL;
if(SUCCEEDED(result = pNode->get_text(&strTemp)))
{
if(!(*ppszValue = EscapeSpecialCharacters(strTemp)))
result = E_OUTOFMEMORY;
SysFreeString(strTemp);
}
}
else // BOOLEAN or Numeric
{
result = pNode->get_text(ppszValue);
}
return result;
}
// Parse one key binding. Return <propName>=<value>
// The key binding is either a KEYVALUE or a VALUE.REFERENCE tag
HRESULT ParseOneKeyBinding(IXMLDOMNode *pNode, LPWSTR *ppszValue)
{
HRESULT result = E_FAIL;
*ppszValue = NULL;
// First get the property name
BSTR strPropertyName = NULL;
if(SUCCEEDED(result = GetBstrAttribute(pNode, NAME_ATTRIBUTE, &strPropertyName)))
{
// See if the child is a KEYVALUE or VALUE.REFERENCE
IXMLDOMNode *pChildNode = NULL;
if(SUCCEEDED(pNode->get_firstChild(&pChildNode)) && pChildNode)
{
BSTR strNodeName = NULL;
if(SUCCEEDED(pChildNode->get_nodeName(&strNodeName)))
{
// Look ahead
if(_wcsicmp(strNodeName, KEYVALUE_TAG) == 0)
{
BSTR strValue = NULL;
if(SUCCEEDED(result = ParseKeyValue(pChildNode, &strValue)))
{
// COncatenate them with an '=' inbetween
if(*ppszValue = new WCHAR [ wcslen(strPropertyName) + wcslen(strValue) + 2])
{
wcscpy(*ppszValue, strPropertyName);
wcscat(*ppszValue, EQUALS_SIGN);
wcscat(*ppszValue, strValue);
}
else
result = E_OUTOFMEMORY;
SysFreeString(strValue);
}
}
else if (_wcsicmp(strNodeName, VALUEREFERENCE_TAG) == 0)
{
BSTR strValue = NULL;
if(SUCCEEDED(result = ParseOneReferenceValue (pChildNode, &strValue)))
{
if(*ppszValue = new WCHAR [ wcslen(strValue) + 1])
wcscpy(*ppszValue, strValue);
else
result = E_OUTOFMEMORY;
SysFreeString(strValue);
}
}
SysFreeString(strNodeName);
}
pChildNode->Release();
}
SysFreeString(strPropertyName);
}
return result;
}
HRESULT ParseClassName (IXMLDOMNode *pNode, BSTR *pstrValue)
{
HRESULT hr = WBEM_E_FAILED;
*pstrValue = NULL;
if(pNode && SUCCEEDED(GetBstrAttribute(pNode, NAME_ATTRIBUTE, pstrValue)))
hr = S_OK;
return hr;
}
// Given a VALUE.REFERENCE element, it creates a string representation of the element
// The string representation is the WMI object path representation
HRESULT ParseOneReferenceValue (IXMLDOMNode *pValueRef, BSTR *pstrValue)
{
HRESULT hr = E_FAIL;
// Let's look at the child of the VALUE.REFERENCE tag
IXMLDOMNode *pChild = NULL;
if (SUCCEEDED(pValueRef->get_firstChild (&pChild)) && pChild)
{
// Next node could be a CLASSPATH, LOCALCLASSPATH, INSTANCEPATH,
// LOCALINSTANCEPATH, CLASSNAME or INSTANCENAME
// or even a VALUE (for Scoped and UMI paths)
BSTR strNodeName = NULL;
if(SUCCEEDED(pChild->get_nodeName(&strNodeName)))
{
if (_wcsicmp(strNodeName, CLASSNAME_TAG) == 0)
{
hr = ParseClassName (pChild, pstrValue);
}
else if (_wcsicmp(strNodeName, LOCALCLASSPATH_TAG) == 0)
{
hr = ParseLocalClassPath (pChild, pstrValue);
}
else if (_wcsicmp(strNodeName, CLASSPATH_TAG) == 0)
{
hr = ParseClassPath (pChild, pstrValue);
}
else if (_wcsicmp(strNodeName, INSTANCENAME_TAG) == 0)
{
hr = ParseInstanceName (pChild, pstrValue);
}
else if (_wcsicmp(strNodeName, LOCALINSTANCEPATH_TAG) == 0)
{
hr = ParseLocalInstancePath (pChild, pstrValue);
}
else if (_wcsicmp(strNodeName, INSTANCEPATH_TAG) == 0)
{
hr = ParseInstancePath (pChild, pstrValue);
}
else if (_wcsicmp(strNodeName, VALUE_TAG) == 0)
{
// Just get its contents
// RAJESHR - what if it is escaped CDATA? We need to unescape it
hr = pChild->get_text(pstrValue);
}
SysFreeString(strNodeName);
}
pChild->Release();
}
return hr;
}
// Given a LOCALCLASSPATH element, gets its WMI object path representation
HRESULT ParseLocalClassPath (IXMLDOMNode *pNode, BSTR *pstrValue)
{
HRESULT hr = WBEM_E_FAILED;
// Expecting (LOCALNAMESPACEPATH followed by CLASSNAME
IXMLDOMNodeList *pNodeList = NULL;
if (pNode && SUCCEEDED(pNode->get_childNodes (&pNodeList)) && pNodeList)
{
IXMLDOMNode *pLocalNSPathNode = NULL;
// Next node should be a LOCALNAMESPACEPATH
if (SUCCEEDED(pNodeList->nextNode (&pLocalNSPathNode)) && pLocalNSPathNode)
{
BSTR strNSNodeName = NULL;
if (SUCCEEDED(pLocalNSPathNode->get_nodeName(&strNSNodeName)) &&
strNSNodeName && (_wcsicmp(strNSNodeName, LOCALNAMESPACEPATH_TAG) == 0))
{
BSTR strLocalNamespace = NULL;
ParseLocalNamespacePath(pLocalNSPathNode, &strLocalNamespace);
// Next node should be the classname
IXMLDOMNode *pClassNameNode = NULL;
if (SUCCEEDED(pNodeList->nextNode (&pClassNameNode)) && pClassNameNode)
{
BSTR strNSClassName = NULL;
if (SUCCEEDED(pClassNameNode->get_nodeName(&strNSClassName)) &&
strNSClassName && (_wcsicmp(strNSClassName, CLASSNAME_TAG) == 0))
{
BSTR strClassName = NULL;
if (SUCCEEDED(GetBstrAttribute (pClassNameNode,
NAME_ATTRIBUTE, &strClassName)))
{
// Phew - finally we have all the info!
LPWSTR pPath = NULL;
if(pPath = new WCHAR [wcslen(strLocalNamespace)
+ wcslen(strClassName) + 2])
{
wcscpy (pPath, strLocalNamespace);
wcscat (pPath, L":");
wcscat (pPath, strClassName);
*pstrValue = NULL;
if(*pstrValue = SysAllocString (pPath))
hr = S_OK;
else
hr = E_OUTOFMEMORY;
delete [] pPath;
}
else
hr = E_OUTOFMEMORY;
SysFreeString (strClassName);
}
}
pClassNameNode->Release ();
SysFreeString (strNSClassName);
}
SysFreeString (strLocalNamespace);
SysFreeString (strNSNodeName);
}
pLocalNSPathNode->Release ();
}
pNodeList->Release ();
}
return hr;
}
// Takes a CLASSPATH element and gets its WMI object path representation
HRESULT ParseClassPath (IXMLDOMNode *pNode, BSTR *pstrValue)
{
HRESULT hr = WBEM_E_FAILED;
// Expecting (NAMESPACEPATH followed by CLASSNAME
IXMLDOMNodeList *pNodeList = NULL;
if (pNode && SUCCEEDED(pNode->get_childNodes (&pNodeList)) && pNodeList)
{
IXMLDOMNode *pNSPathNode = NULL;
// Next node should be a NAMESPACEPATH
if (SUCCEEDED(pNodeList->nextNode (&pNSPathNode)) && pNSPathNode)
{
BSTR strNSNodeName = NULL;
if (SUCCEEDED(pNSPathNode->get_nodeName(&strNSNodeName)) &&
strNSNodeName && (_wcsicmp(strNSNodeName, NAMESPACEPATH_TAG) == 0))
{
BSTR strHost = NULL;
BSTR strNamespace = NULL;
if (SUCCEEDED (hr = ParseNamespacePath(pNSPathNode, &strHost, &strNamespace)))
{
// Next node should be the CLASSNAME
IXMLDOMNode *pClassNameNode = NULL;
if (SUCCEEDED(pNodeList->nextNode (&pClassNameNode)) && pClassNameNode)
{
BSTR strNSClassName = NULL;
if (SUCCEEDED(pClassNameNode->get_nodeName(&strNSClassName)) &&
strNSClassName && (_wcsicmp(strNSClassName, CLASSNAME_TAG) == 0))
{
BSTR strClassName = NULL;
if (SUCCEEDED(GetBstrAttribute (pClassNameNode,
NAME_ATTRIBUTE, &strClassName)))
{
// Phew - finally we have all the info!
LPWSTR pPath = NULL;
if(pPath = new WCHAR [wcslen(strHost)
+ wcslen(strNamespace) + wcslen(strClassName) + 5])
{
wcscpy (pPath, L"\\\\");
wcscat (pPath, strHost);
wcscat (pPath, L"\\");
wcscat (pPath, strNamespace);
wcscat (pPath, L":");
wcscat (pPath, strClassName);
*pstrValue = NULL;
if(*pstrValue = SysAllocString (pPath))
hr = S_OK;
else
hr = E_OUTOFMEMORY;
delete [] pPath;
}
else
hr = E_OUTOFMEMORY;
SysFreeString (strClassName);
}
SysFreeString (strNSClassName);
}
pClassNameNode->Release ();
}
SysFreeString (strHost);
SysFreeString (strNamespace);
}
SysFreeString (strNSNodeName);
}
pNSPathNode->Release ();
}
pNodeList->Release ();
}
return hr;
}
// Parse an instance nameest
HRESULT ParseKeyBinding(IXMLDOMNode *pNode, BSTR strClassName, BSTR *pstrInstanceName)
{
HRESULT result = E_FAIL;
LPWSTR pszInstanceName = NULL;
if(!(pszInstanceName = new WCHAR [ wcslen(strClassName) + 2]))
return E_OUTOFMEMORY;
wcscpy(pszInstanceName, strClassName);
wcscat(pszInstanceName, DOT_SIGN);
// Go thru each of the key bindings
//=======================================================
IXMLDOMNodeList *pBindings = NULL;
if(SUCCEEDED(result = pNode->get_childNodes(&pBindings)))
{
IXMLDOMNode *pNextBinding = NULL;
while(SUCCEEDED(result = pBindings->nextNode(&pNextBinding)) && pNextBinding)
{
LPWSTR pszNextValue = NULL;
if(result = SUCCEEDED(ParseOneKeyBinding(pNextBinding, &pszNextValue)))
{
LPWSTR pTemp = NULL;
if(pTemp = new WCHAR [wcslen(pszInstanceName) + wcslen(pszNextValue) + 2])
{
wcscpy(pTemp, pszInstanceName);
wcscat(pTemp, pszNextValue);
wcscat(pTemp, COMMA_SIGN);
delete [] pszInstanceName;
delete [] pszNextValue;
pszInstanceName = pTemp;
}
else
result = E_OUTOFMEMORY;
}
pNextBinding->Release();
pNextBinding = NULL;
if(FAILED(result))
break;
}
pBindings->Release();
}
if(SUCCEEDED(result))
{
// Get rid of the last comma
pszInstanceName[wcslen(pszInstanceName) - 1] = NULL;
if(!(*pstrInstanceName = SysAllocString(pszInstanceName)))
result = E_OUTOFMEMORY;
}
else
*pstrInstanceName = NULL;
delete [] pszInstanceName;
return result;
}
HRESULT ParseLocalNamespacePath(IXMLDOMNode *pLocalNamespaceNode, BSTR *pstrLocalNamespacePath)
{
// Go thru the children collecting the NAME attribute and concatenating
// This requires 2 passes since we dont know the length
//=============================================================
DWORD dwLength=0;
*pstrLocalNamespacePath = NULL;
HRESULT result = E_FAIL;
IXMLDOMNodeList *pChildren = NULL;
if(SUCCEEDED(result = pLocalNamespaceNode->get_childNodes(&pChildren)))
{
IXMLDOMNode *pNextChild = NULL;
while(SUCCEEDED(pChildren->nextNode(&pNextChild)) && pNextChild)
{
BSTR strAttributeValue = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextChild, NAME_ATTRIBUTE, &strAttributeValue)))
{
dwLength += wcslen(strAttributeValue);
dwLength ++; // For the back slash
SysFreeString(strAttributeValue);
}
pNextChild->Release();
pNextChild = NULL;
}
// Allocate memory
LPWSTR pszNamespaceValue = NULL;
if(pszNamespaceValue = new WCHAR[dwLength + 1])
{
pszNamespaceValue[0] = 0;
// Once more
pNextChild = NULL;
pChildren->reset();
while(SUCCEEDED(pChildren->nextNode(&pNextChild)) && pNextChild)
{
BSTR strAttributeValue = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextChild, NAME_ATTRIBUTE, &strAttributeValue)))
{
wcscat(pszNamespaceValue, strAttributeValue);
wcscat(pszNamespaceValue, BACK_SLASH_WSTR);
SysFreeString(strAttributeValue);
}
pNextChild->Release();
pNextChild = NULL;
}
// Remove the last back slash
pszNamespaceValue[dwLength-1] = NULL;
if(!(*pstrLocalNamespacePath = SysAllocString(pszNamespaceValue)))
result = E_OUTOFMEMORY;
delete [] pszNamespaceValue;
}
else
result = E_OUTOFMEMORY;
pChildren->Release();
}
return result;
}
HRESULT ParseNamespacePath(IXMLDOMNode *pLocalNamespaceNode, BSTR *pstrHost, BSTR *pstrLocalNamespace)
{
HRESULT result = E_FAIL;
*pstrHost = NULL;
*pstrLocalNamespace = NULL;
// Get the HOST name first
IXMLDOMNode *pFirstNode = NULL, *pSecondNode = NULL;
if(SUCCEEDED(pLocalNamespaceNode->get_firstChild(&pFirstNode)) && pFirstNode)
{
// Get the Namespace part
if(SUCCEEDED (pFirstNode->get_text(pstrHost)))
{
if(SUCCEEDED(pLocalNamespaceNode->get_lastChild(&pSecondNode)))
{
// Get the instance path
if(SUCCEEDED(ParseLocalNamespacePath(pSecondNode, pstrLocalNamespace)))
{
result = S_OK;
}
pSecondNode->Release();
}
}
pFirstNode->Release();
}
if(FAILED(result))
{
SysFreeString(*pstrHost);
*pstrHost = NULL;
}
return result;
}
// Parse an instance name
HRESULT ParseInstanceName(IXMLDOMNode *pNode, BSTR *pstrInstanceName)
{
HRESULT result = E_FAIL;
// First get the class name
BSTR strClassName = NULL;
if(SUCCEEDED(result = GetBstrAttribute(pNode, CLASS_NAME_ATTRIBUTE, &strClassName)))
{
// See if the child is a KEYBINDING or KEYVALUE or
IXMLDOMNode *pChildNode = NULL;
if(SUCCEEDED(result = pNode->get_firstChild(&pChildNode)) && pChildNode)
{
BSTR strNodeName = NULL;
if(SUCCEEDED(result = pChildNode->get_nodeName(&strNodeName)))
{
// Look ahead
if(_wcsicmp(strNodeName, KEYBINDING_TAG) == 0)
{
result = ParseKeyBinding(pNode, strClassName, pstrInstanceName);
}
else if (_wcsicmp(strNodeName, KEYVALUE_TAG) == 0)
{
BSTR strKeyValue = NULL;
if(SUCCEEDED(result = ParseKeyValue(pNode, &strKeyValue)))
{
LPWSTR pszInstanceName = NULL;
if(pszInstanceName = new WCHAR[wcslen(strClassName) + wcslen(strKeyValue) + 2])
{
wcscpy(pszInstanceName, strClassName);
wcscat(pszInstanceName, EQUALS_SIGN);
wcscat(pszInstanceName, strKeyValue);
if(!(*pstrInstanceName = SysAllocString(pszInstanceName)) )
result = E_OUTOFMEMORY;
delete [] pszInstanceName;
}
else
result = E_OUTOFMEMORY;
SysFreeString(strKeyValue);
}
}
SysFreeString(strNodeName);
}
pChildNode->Release();
}
SysFreeString(strClassName);
}
return result;
}
// Takes a LOCALINSTANCEPATH element and gives its WMI object path representation
HRESULT ParseLocalInstancePath (IXMLDOMNode *pNode, BSTR *pstrValue)
{
HRESULT hr = WBEM_E_FAILED;
// Expecting (LOCALNAMESPACEPATH followed by INSTANCENAME
IXMLDOMNodeList *pNodeList = NULL;
if (pNode && SUCCEEDED(pNode->get_childNodes (&pNodeList)) && pNodeList)
{
IXMLDOMNode *pLocalNSPathNode = NULL;
// Next node should be a LOCALNAMESPACEPATH
if (SUCCEEDED(pNodeList->nextNode (&pLocalNSPathNode)) && pLocalNSPathNode)
{
BSTR strNSNodeName = NULL;
if (SUCCEEDED(pLocalNSPathNode->get_nodeName(&strNSNodeName)) &&
strNSNodeName && (_wcsicmp(strNSNodeName, LOCALNAMESPACEPATH_TAG) == 0))
{
BSTR strLocalNamespace = NULL;
ParseLocalNamespacePath(pLocalNSPathNode, &strLocalNamespace);
// Next node should be the INSTANCENAME
IXMLDOMNode *pInstanceNameNode = NULL;
if (SUCCEEDED(pNodeList->nextNode (&pInstanceNameNode)) && pInstanceNameNode)
{
BSTR strNSInstanceName = NULL;
if (SUCCEEDED(pInstanceNameNode->get_nodeName(&strNSInstanceName)) &&
strNSInstanceName && (_wcsicmp(strNSInstanceName, INSTANCENAME_TAG) == 0))
{
BSTR strInstanceName = NULL;
if (SUCCEEDED(hr = ParseInstanceName (pInstanceNameNode,
&strInstanceName)))
{
// Phew - finally we have all the info!
LPWSTR pPath = NULL;
if(pPath = new WCHAR [wcslen(strLocalNamespace)
+ wcslen(strInstanceName) + 2])
{
wcscpy (pPath, strLocalNamespace);
wcscat (pPath, L":");
wcscat (pPath, strInstanceName);
*pstrValue = NULL;
if(*pstrValue = SysAllocString (pPath))
hr = S_OK;
else
hr = E_OUTOFMEMORY;
delete [] pPath;
}
else
hr = E_OUTOFMEMORY;
SysFreeString (strInstanceName);
}
SysFreeString (strNSInstanceName);
}
pInstanceNameNode->Release ();
}
SysFreeString (strLocalNamespace);
SysFreeString (strNSNodeName);
}
pLocalNSPathNode->Release ();
}
pNodeList->Release ();
}
return hr;
}
// Parse an instance name
HRESULT ParseLocalInstancePathIntoNsAndInstName(IXMLDOMNode *pNode, BSTR *pstrNamespace, BSTR *pstrInstanceName)
{
HRESULT result = E_FAIL;
// See if the child is a KEYBINDING or KEYVALUE or KEYREFERENCE
IXMLDOMNode *pFirstNode, *pSecondNode = NULL;
if(SUCCEEDED(result = pNode->get_firstChild(&pFirstNode)) && pFirstNode)
{
// Get the Namespace part
if(SUCCEEDED(result = ParseLocalNamespacePath(pFirstNode, pstrNamespace)))
{
if(SUCCEEDED(result = pNode->get_lastChild(&pSecondNode)))
{
// Get the instance path
if(SUCCEEDED(result = ParseInstanceName(pSecondNode, pstrInstanceName)))
{
}
pSecondNode->Release();
}
if(FAILED(result))
{
SysFreeString(*pstrNamespace);
*pstrNamespace = NULL;
}
}
pFirstNode->Release();
}
return result;
}
// Takes an INSTANCEPATH node and gets its WMI object path representation
HRESULT ParseInstancePath (IXMLDOMNode *pNode, BSTR *pstrValue)
{
HRESULT hr = WBEM_E_FAILED;
// Expecting NAMESPACEPATH followed by INSTANCENAME
IXMLDOMNodeList *pNodeList = NULL;
if (pNode && SUCCEEDED(pNode->get_childNodes (&pNodeList)) && pNodeList)
{
IXMLDOMNode *pNSPathNode = NULL;
// Next node should be a NAMESPACEPATH
if (SUCCEEDED(pNodeList->nextNode (&pNSPathNode)) && pNSPathNode)
{
BSTR strNSNodeName = NULL;
if (SUCCEEDED(pNSPathNode->get_nodeName(&strNSNodeName)) &&
strNSNodeName && (_wcsicmp(strNSNodeName, NAMESPACEPATH_TAG) == 0))
{
BSTR strHost = NULL;
BSTR strNamespace = NULL;
if (SUCCEEDED (hr = ParseNamespacePath(pNSPathNode, &strHost, &strNamespace)))
{
// Next node should be the INSTANCENAME
IXMLDOMNode *pInstanceNameNode = NULL;
if (SUCCEEDED(pNodeList->nextNode (&pInstanceNameNode)) && pInstanceNameNode)
{
BSTR strNSInstanceName = NULL;
if (SUCCEEDED(pInstanceNameNode->get_nodeName(&strNSInstanceName)) &&
strNSInstanceName && (_wcsicmp(strNSInstanceName, INSTANCENAME_TAG) == 0))
{
BSTR strInstanceName = NULL;
if (SUCCEEDED(hr = ParseInstanceName (pInstanceNameNode,
&strInstanceName)))
{
// Phew - finally we have all the info!
LPWSTR pPath = NULL;
if(pPath = new WCHAR [wcslen(strHost)
+ wcslen(strNamespace) + wcslen(strInstanceName) + 5])
{
wcscpy (pPath, L"\\\\");
wcscat (pPath, strHost);
wcscat (pPath, L"\\");
wcscat (pPath, strNamespace);
wcscat (pPath, L":");
wcscat (pPath, strInstanceName);
*pstrValue = NULL;
if(*pstrValue = SysAllocString (pPath))
hr = S_OK;
else
hr = E_OUTOFMEMORY;
delete [] pPath;
}
else
hr = E_OUTOFMEMORY;
SysFreeString (strInstanceName);
}
SysFreeString (strNSInstanceName);
}
pInstanceNameNode->Release ();
}
SysFreeString (strHost);
SysFreeString (strNamespace);
}
SysFreeString (strNSNodeName);
}
pNSPathNode->Release ();
}
pNodeList->Release ();
}
return hr;
}
// Parse an class name
HRESULT ParseLocalClassPathAsNsAndClass(IXMLDOMNode *pNode, BSTR *pstrNamespace, BSTR *pstrClassPath)
{
HRESULT result = E_FAIL;
// See if the child is a KEYBINDING or KEYVALUE or KEYREFERENCE
IXMLDOMNode *pFirstNode, *pSecondNode = NULL;
if(SUCCEEDED(result = pNode->get_firstChild(&pFirstNode)) && pFirstNode)
{
// Get the Namespace part
if(SUCCEEDED(result = ParseLocalNamespacePath(pFirstNode, pstrNamespace)))
{
if(SUCCEEDED(result = pNode->get_lastChild(&pSecondNode)))
{
// Get the class name
if(SUCCEEDED(result = GetBstrAttribute(pSecondNode, NAME_ATTRIBUTE, pstrClassPath)))
{
}
pSecondNode->Release();
}
if(FAILED(result))
{
SysFreeString(*pstrNamespace);
*pstrNamespace = NULL;
}
}
pFirstNode->Release();
}
return result;
}
// Parse an instance path
HRESULT ParseInstancePath(IXMLDOMNode *pNode, BSTR *pstrHostName, BSTR *pstrNamespace, BSTR *pstrInstancePath)
{
HRESULT result = E_FAIL;
// Get the Namespacepath followed by the instance name
IXMLDOMNode *pFirstNode, *pSecondNode = NULL;
if(SUCCEEDED(result = pNode->get_firstChild(&pFirstNode)) && pFirstNode)
{
// Get the Namespace part
if(SUCCEEDED(result = ParseNamespacePath(pFirstNode, pstrHostName, pstrNamespace)))
{
if(SUCCEEDED(result = pNode->get_lastChild(&pSecondNode)))
{
// Get the instance path
if(SUCCEEDED(result = ParseInstanceName(pSecondNode, pstrInstancePath)))
{
}
pSecondNode->Release();
}
if(FAILED(result))
{
SysFreeString(*pstrHostName);
SysFreeString(*pstrNamespace);
*pstrHostName = NULL;
*pstrNamespace = NULL;
}
}
pFirstNode->Release();
}
return result;
}
// Parse a VALUE.ARRAY For now, assume that it's an array of strings
HRESULT ParseValueArray(IXMLDOMNode *pNode, BSTR **ppstrPropertyList, DWORD *pdwCount)
{
HRESULT result = E_FAIL;
*ppstrPropertyList = NULL;
// Go thru each of the VALUE nodes
//=======================================================
IXMLDOMNodeList *pList = NULL;
if(SUCCEEDED(result = pNode->get_childNodes(&pList)))
{
*pdwCount = 0;
long lCount = 0;
pList->get_length(&lCount);
*pdwCount = lCount;
// Allocate memory
if(*ppstrPropertyList = new BSTR [*pdwCount])
{
DWORD i=0;
IXMLDOMNode *pNextProperty = NULL;
while(SUCCEEDED(pList->nextNode(&pNextProperty)) && pNextProperty)
{
// Get the string in the VALUE
BSTR strNextName = NULL;
if(SUCCEEDED(ParseValue(pNextProperty,&((*ppstrPropertyList)[i]))))
{
}
else
ppstrPropertyList[i] = NULL;
pNextProperty->Release();
pNextProperty = NULL;
i++;
}
}
else
result = E_OUTOFMEMORY;
pList->Release();
}
return result;
}
// Parse PARAMVALUE.ARRAY in a propertylist
HRESULT ParsePropertyList(IXMLDOMNode *pNode, BSTR **ppstrPropertyList, DWORD *pdwCount)
{
// See if the child is a VALUE.ARRAY
HRESULT result = E_FAIL;
*ppstrPropertyList = NULL;
// Get the Namespacepath followed by the instance name
IXMLDOMNode *pFirstNode = NULL;
if(SUCCEEDED(result = pNode->get_firstChild(&pFirstNode)) && pFirstNode)
{
// THis should be a VALUE.ARRAY
if(SUCCEEDED(result = ParseValueArray(pFirstNode, ppstrPropertyList, pdwCount)))
{
}
pFirstNode->Release();
}
return result;
}
// Parse PARAMVALUE - the result is the child of this tag in ppValue and the name
// attribute of PARAMVALUE in ppszParamName
HRESULT ParseParamValue(IXMLDOMNode *pNode, BSTR *ppszParamName, IXMLDOMNode **ppValue)
{
HRESULT result = E_FAIL;
*ppValue = NULL;
// See if it has a child element which is
// (VALUE|VALUE.REFERENCE|VALUE.ARRAY|VALUE.REFARRAY|VALUE.OBJECT|VALUE.OBJECTARRAY)
if(SUCCEEDED(result = pNode->get_firstChild(ppValue)) && (*ppValue))
{
BSTR strChildName = NULL;
if(SUCCEEDED(result = (*ppValue)->get_nodeName(&strChildName)))
{
if(_wcsicmp(strChildName, VALUE_TAG) == 0 ||
_wcsicmp(strChildName, VALUEARRAY_TAG) == 0 ||
_wcsicmp(strChildName, VALUEOBJECT_TAG) == 0 ||
_wcsicmp(strChildName, VALUEREFERENCE_TAG) == 0 ||
_wcsicmp(strChildName, VALUEOBJECTARRAY_TAG) == 0 ||
_wcsicmp(strChildName, VALUEREFARRAY_TAG) == 0 )
{
if(SUCCEEDED(result = GetBstrAttribute(pNode, NAME_ATTRIBUTE, ppszParamName)))
{
(*ppValue)->AddRef();
}
}
SysFreeString(strChildName);
}
(*ppValue)->Release();
}
if(FAILED(result) && (*ppValue))
{
(*ppValue)->Release();
*ppValue = NULL;
}
return result;
}
// Parse a PARAMVVALUE.INSTNAME
HRESULT ParseParamValueInstName(IXMLDOMNode *pNode, BSTR *pstrInstanceName)
{
HRESULT result = E_FAIL;
IXMLDOMNode *pChildNode = NULL;
if(SUCCEEDED(result = pNode->get_firstChild(&pChildNode)) && pChildNode)
{
result = ParseInstanceName(pChildNode, pstrInstanceName);
pChildNode->Release();
}
return result;
}
// Parse a Get Class request
CCimHttpGetClass * ParseGetClassMethod (
IXMLDOMNode *pNode,
BSTR strID)
{
CCimHttpGetClass *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a GetClass reques
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
// String values of the parameters
BSTR strLocalNamespace = NULL;
BSTR strClassName = NULL;
BSTR strLocalOnlyValue = NULL;
BSTR strIncludeQualifiers = NULL;
BSTR strIncludeClassOrigin = NULL;
BSTR *strPropertyList = NULL;
DWORD dwPropCount = 0;
// Set the optional parameters to their defaults
BOOLEAN bLocalsOnly = TRUE;
BOOLEAN bIncludeQualifiers = TRUE;
BOOLEAN bIncludeClassOrigin = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, CLASS_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strClassName);
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, LOCAL_ONLY_PARAM) == 0)
{
pNextParam->get_text(&strLocalOnlyValue);
}
else if(_wcsicmp(strParamName, INCLUDE_QUALIFIERS_PARAM) == 0)
{
pNextParam->get_text(&strIncludeQualifiers);
}
else if(_wcsicmp(strParamName, INCLUDE_CLASS_ORIGIN_PARAM) == 0)
{
pNextParam->get_text(&strIncludeClassOrigin);
}
else if(_wcsicmp(strParamName, PROPERTY_LIST_PARAM) == 0)
{
ParsePropertyList(pNextParam, &strPropertyList, &dwPropCount);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// Sort out the parameters created above
if(strLocalOnlyValue && _wcsicmp(strLocalOnlyValue, FALSE_WSTR) == 0)
bLocalsOnly = FALSE;
if(strIncludeQualifiers && _wcsicmp(strIncludeQualifiers, FALSE_WSTR) == 0)
bIncludeQualifiers = FALSE;
if(strIncludeClassOrigin && _wcsicmp(strIncludeClassOrigin, TRUE_WSTR) == 0)
bIncludeClassOrigin = TRUE;
// We only free those that are not needed
// The other pointers get copied by the contructor
SysFreeString(strLocalOnlyValue);
SysFreeString(strIncludeQualifiers);
SysFreeString(strIncludeClassOrigin);
pReturnValue = new CCimHttpGetClass(strClassName, strPropertyList, dwPropCount, bLocalsOnly, bIncludeQualifiers, bIncludeClassOrigin, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Create Class request
CCimHttpCreateClass * ParseCreateClassMethod (
IXMLDOMNode *pNode,
BSTR strID,
BOOLEAN bIsModify)
{
CCimHttpCreateClass *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
LONG lFlags = 0;
// Collect the list of parameters
//===============================
BSTR strLocalNamespace = NULL;
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
IXMLDOMNode *pClass = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if( 0 == _wcsicmp(strParamName, (bIsModify)? MODIFIED_CLASS_PARAM : NEW_CLASS_PARAM) )
{
// This should be a CLASS element
IXMLDOMNode *pPutativeClass = NULL;
if (SUCCEEDED (pNextParam->get_firstChild (&pPutativeClass)) && pPutativeClass)
{
BSTR strNodeName3 = NULL;
if (SUCCEEDED(pPutativeClass->get_nodeName
(&strNodeName3)))
{
if (_wcsicmp(strNodeName3, CLASS_TAG) == 0)
{
// Yowzer - we have it
pClass = pPutativeClass;
pClass->AddRef ();
}
SysFreeString (strNodeName3);
}
pPutativeClass->Release ();
}
}
else if( 0 == _wcsicmp(strParamName, LFLAGS_PARAM) )
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
ParseLongArgument (pParamValue, &lFlags);
pParamValue->Release ();
}
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpCreateClass(pClass, strLocalNamespace, strID,
bIsModify);
if(pClass)
pClass->Release();
if(pReturnValue)
{
pReturnValue->SetContextObject(pContextObject);
pReturnValue->SetFlags(lFlags);
}
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Create Instance request
CCimHttpCreateInstance * ParseCreateInstanceMethod (
IXMLDOMNode *pNode,
BSTR strID
)
{
CCimHttpCreateInstance *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a CreateInstance request
//============================================================
BSTR strLocalNamespace = NULL;
IXMLDOMNodeList *pParameters = NULL;
LONG lFlags = 0;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
IXMLDOMNode *pInstance = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, NEW_INSTANCE_PARAM) == 0)
{
// Should find a <INSTANCE> element now
IXMLDOMNode *pPutativeInstance = NULL;
if (SUCCEEDED (pNextParam->get_firstChild (&pPutativeInstance)) && pPutativeInstance)
{
BSTR strNodeName3 = NULL;
if (SUCCEEDED(pPutativeInstance->get_nodeName
(&strNodeName3)))
{
if (_wcsicmp(strNodeName3, INSTANCE_TAG) == 0)
{
// Yowzer - we have it
pInstance = pPutativeInstance;
pInstance->AddRef ();
}
SysFreeString (strNodeName3);
}
pPutativeInstance->Release ();
}
}
else if( 0 == _wcsicmp(strParamName, LFLAGS_PARAM) )
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
ParseLongArgument (pParamValue, &lFlags);
pParamValue->Release ();
}
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// We only free those that are not needed
// The other pointers get copied by the contructor
pReturnValue = new CCimHttpCreateInstance(pInstance, strLocalNamespace, strID);
if(pInstance)
pInstance->Release();
if(pReturnValue)
{
pReturnValue->SetContextObject(pContextObject);
pReturnValue->SetFlags(lFlags);
}
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Modify Instance request
CCimHttpModifyInstance * ParseModifyInstanceMethod (
IXMLDOMNode *pNode,
BSTR strID
)
{
CCimHttpModifyInstance *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a ModifyInstance request
//============================================================
BSTR strLocalNamespace = NULL;
IXMLDOMNodeList *pParameters = NULL;
BSTR strInstanceName = NULL;
LONG lFlags = 0;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
IXMLDOMNode *pInstance = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, MODIFIED_INSTANCE_PARAM) == 0)
{
// This should be a VALUE.NAMEDOBJECT element
IXMLDOMNode *pValue = NULL;
// RAJESHR must only be one node
if (SUCCEEDED (pNextParam->get_firstChild (&pValue)) && pValue)
{
BSTR strNodeName2 = NULL;
if(SUCCEEDED(pValue->get_nodeName(&strNodeName2)))
{
if(_wcsicmp(strNodeName2, VALUENAMEDOBJECT_TAG) == 0)
{
IXMLDOMNodeList *pInstNodeList = NULL;
if (SUCCEEDED(pValue->get_childNodes (&pInstNodeList)))
{
// Should find an <INSTANCENAME>
// and an <INSTANCE> element under here
IXMLDOMNode *pInstNameNode = NULL;
if (SUCCEEDED(pInstNodeList->nextNode (&pInstNameNode))
&& pInstNameNode)
{
BSTR instNameNode = NULL;
if(SUCCEEDED(pInstNameNode->get_nodeName(&instNameNode)))
{
if(_wcsicmp(instNameNode, INSTANCENAME_TAG) == 0)
{
// Parse into path
ParseInstanceName (pInstNameNode, &strInstanceName);
}
SysFreeString (instNameNode);
}
pInstNameNode->Release ();
}
if (SUCCEEDED (pInstNodeList->nextNode (&pInstance))
&& pInstance)
{
BSTR strInstanceNodeName = NULL;
if (SUCCEEDED(pInstance->get_nodeName
(&strInstanceNodeName)))
{
if (0 != _wcsicmp(strInstanceNodeName, INSTANCE_TAG))
{
// Error - get rid of it
pInstance->Release ();
pInstance = NULL;
}
SysFreeString (strInstanceNodeName);
}
else
{
// Error - get rid of it
pInstance->Release ();
pInstance = NULL;
}
}
pInstNodeList->Release ();
}
}
SysFreeString (strNodeName2);
}
pValue->Release ();
}
}
else if( 0 == _wcsicmp(strParamName, LFLAGS_PARAM) )
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
ParseLongArgument (pParamValue, &lFlags);
pParamValue->Release ();
}
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// We only free those that are not needed
// The other pointers get copied by the contructor
pReturnValue = new CCimHttpModifyInstance(pInstance, strInstanceName,
strLocalNamespace, strID);
if(pInstance)
pInstance->Release();
if(pReturnValue)
{
pReturnValue->SetContextObject(pContextObject);
pReturnValue->SetFlags(lFlags);
}
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Delete Class request
CCimHttpDeleteClass * ParseDeleteClassMethod (
IXMLDOMNode *pNode,
BSTR strID)
{
CCimHttpDeleteClass *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a DeleteClass reques
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
// String values of the parameters
BSTR strLocalNamespace = NULL;
BSTR strClassName = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, CLASS_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strClassName);
pParamValue->Release ();
}
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpDeleteClass(strClassName, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an EnumerateInstance request
CCimHttpEnumerateInstances * ParseEnumerateInstancesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpEnumerateInstances *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a Enumerate Instances request
//=================================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strClassName = NULL;
BSTR strLocalOnlyValue = NULL;
BSTR strDeepInheritanceValue = NULL;
BSTR strIncludeQualifiers = NULL;
BSTR strIncludeClassOrigin = NULL;
BSTR *strPropertyList = NULL;
DWORD dwPropCount = 0;
// Set the optional parameters to their defaults
BOOLEAN bLocalsOnly = TRUE;
BOOLEAN bDeepInheritance = TRUE;
BOOLEAN bIncludeQualifiers = FALSE;
BOOLEAN bIncludeClassOrigin = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, CLASS_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strClassName);
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, LOCAL_ONLY_PARAM) == 0)
{
pNextParam->get_text(&strLocalOnlyValue);
}
else if(_wcsicmp(strParamName, DEEP_INHERITANCE_PARAM) == 0)
{
pNextParam->get_text(&strDeepInheritanceValue);
}
else if(_wcsicmp(strParamName, INCLUDE_QUALIFIERS_PARAM) == 0)
{
pNextParam->get_text(&strIncludeQualifiers);
}
else if(_wcsicmp(strParamName, INCLUDE_CLASS_ORIGIN_PARAM) == 0)
{
pNextParam->get_text(&strIncludeClassOrigin);
}
else if(_wcsicmp(strParamName, PROPERTY_LIST_PARAM) == 0)
{
ParsePropertyList(pNextParam, &strPropertyList, &dwPropCount);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// Sort out the parameters created above
if(strLocalOnlyValue && _wcsicmp(strLocalOnlyValue, FALSE_WSTR) == 0)
bLocalsOnly = FALSE;
if(strDeepInheritanceValue && _wcsicmp(strDeepInheritanceValue, FALSE_WSTR) == 0)
bDeepInheritance = FALSE;
if(strIncludeQualifiers && _wcsicmp(strIncludeQualifiers, TRUE_WSTR) == 0)
bIncludeQualifiers = TRUE;
if(strIncludeClassOrigin && _wcsicmp(strIncludeClassOrigin, TRUE_WSTR) == 0)
bIncludeClassOrigin = TRUE;
SysFreeString(strLocalOnlyValue);
SysFreeString(strIncludeQualifiers);
SysFreeString(strIncludeClassOrigin);
SysFreeString(strDeepInheritanceValue);
pReturnValue = new CCimHttpEnumerateInstances(strClassName, strPropertyList, dwPropCount, bDeepInheritance, bLocalsOnly, bIncludeQualifiers, bIncludeClassOrigin, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an EnumerateInstanceNames request
CCimHttpEnumerateInstanceNames * ParseEnumerateInstanceNamesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpEnumerateInstanceNames *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a Enumerate InstanceNames request
//=====================================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strClassName = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, CLASS_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strClassName);
pParamValue->Release ();
}
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpEnumerateInstanceNames(strClassName, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an EnumerateClasses request
CCimHttpEnumerateClasses * ParseEnumerateClassesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpEnumerateClasses *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a Enumerate Instances request
//=================================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strClassName = NULL;
BSTR strLocalOnlyValue = NULL;
BSTR strDeepInheritanceValue = NULL;
BSTR strIncludeQualifiers = NULL;
BSTR strIncludeClassOrigin = NULL;
BSTR *strPropertyList = NULL;
DWORD dwPropCount = 0;
// Set the optional parameters to their defaults
BOOLEAN bLocalsOnly = TRUE;
BOOLEAN bDeepInheritance = TRUE;
BOOLEAN bIncludeQualifiers = FALSE;
BOOLEAN bIncludeClassOrigin = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, CLASS_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strClassName);
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, LOCAL_ONLY_PARAM) == 0)
{
pNextParam->get_text(&strLocalOnlyValue);
}
else if(_wcsicmp(strParamName, DEEP_INHERITANCE_PARAM) == 0)
{
pNextParam->get_text(&strDeepInheritanceValue);
}
else if(_wcsicmp(strParamName, INCLUDE_QUALIFIERS_PARAM) == 0)
{
pNextParam->get_text(&strIncludeQualifiers);
}
else if(_wcsicmp(strParamName, INCLUDE_CLASS_ORIGIN_PARAM) == 0)
{
pNextParam->get_text(&strIncludeClassOrigin);
}
else if(_wcsicmp(strParamName, PROPERTY_LIST_PARAM) == 0)
{
ParsePropertyList(pNextParam, &strPropertyList, &dwPropCount);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// Sort out the parameters created above
if(strLocalOnlyValue && _wcsicmp(strLocalOnlyValue, FALSE_WSTR) == 0)
bLocalsOnly = FALSE;
if(strDeepInheritanceValue && _wcsicmp(strDeepInheritanceValue, FALSE_WSTR) == 0)
bDeepInheritance = FALSE;
if(strIncludeQualifiers && _wcsicmp(strIncludeQualifiers, TRUE_WSTR) == 0)
bIncludeQualifiers = TRUE;
if(strIncludeClassOrigin && _wcsicmp(strIncludeClassOrigin, TRUE_WSTR) == 0)
bIncludeClassOrigin = TRUE;
SysFreeString(strLocalOnlyValue);
SysFreeString(strIncludeQualifiers);
SysFreeString(strIncludeClassOrigin);
SysFreeString(strDeepInheritanceValue);
pReturnValue = new CCimHttpEnumerateClasses(strClassName, strPropertyList, dwPropCount, bDeepInheritance, bLocalsOnly, bIncludeQualifiers, bIncludeClassOrigin, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an EnumerateClassNames request
CCimHttpEnumerateClassNames * ParseEnumerateClassNamesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpEnumerateClassNames *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a EnumerateClassNames request
//=================================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strClassName = NULL;
BSTR strDeepInheritanceValue = NULL;
BOOLEAN bDeepInheritance = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, CLASS_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strClassName);
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, DEEP_INHERITANCE_PARAM) == 0)
{
pNextParam->get_text(&strDeepInheritanceValue);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
if(strDeepInheritanceValue && _wcsicmp(strDeepInheritanceValue, TRUE_WSTR) == 0)
bDeepInheritance = TRUE;
SysFreeString(strDeepInheritanceValue);
pReturnValue = new CCimHttpEnumerateClassNames(strClassName, strLocalNamespace,
bDeepInheritance, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Get Instance request
CCimHttpGetInstance * ParseGetInstanceMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpGetInstance *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a GetInstance reques
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strInstanceName = NULL;
BSTR strLocalOnlyValue = NULL;
BSTR strIncludeQualifiers = NULL;
BSTR strIncludeClassOrigin = NULL;
BSTR *strPropertyList = NULL;
DWORD dwPropCount = 0;
// Set the optional parameters to their defaults
BOOLEAN bLocalsOnly = TRUE;
BOOLEAN bIncludeQualifiers = FALSE;
BOOLEAN bIncludeClassOrigin = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, LOCAL_ONLY_PARAM) == 0)
{
pNextParam->get_text(&strLocalOnlyValue);
}
else if(_wcsicmp(strParamName, INCLUDE_QUALIFIERS_PARAM) == 0)
{
pNextParam->get_text(&strIncludeQualifiers);
}
else if(_wcsicmp(strParamName, INCLUDE_CLASS_ORIGIN_PARAM) == 0)
{
pNextParam->get_text(&strIncludeClassOrigin);
}
if(_wcsicmp(strParamName, INSTANCE_NAME_PARAM) == 0)
{
ParseParamValueInstName(pNextParam, &strInstanceName);
}
else if(_wcsicmp(strParamName, PROPERTY_LIST_PARAM) == 0)
{
ParsePropertyList(pNextParam, &strPropertyList, &dwPropCount);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// Sort out the parameters created above
if(strLocalOnlyValue && _wcsicmp(strLocalOnlyValue, FALSE_WSTR) == 0)
bLocalsOnly = FALSE;
if(strIncludeQualifiers && _wcsicmp(strIncludeQualifiers, TRUE_WSTR) == 0)
bIncludeQualifiers = TRUE;
if(strIncludeClassOrigin && _wcsicmp(strIncludeClassOrigin, TRUE_WSTR) == 0)
bIncludeClassOrigin = TRUE;
SysFreeString(strLocalOnlyValue);
SysFreeString(strIncludeQualifiers);
SysFreeString(strIncludeClassOrigin);
pReturnValue = new CCimHttpGetInstance(strInstanceName, strPropertyList, dwPropCount,
bLocalsOnly, bIncludeQualifiers, bIncludeClassOrigin, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Delete Instance request
CCimHttpDeleteInstance * ParseDeleteInstanceMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpDeleteInstance *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a DeleteInstance request
//============================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strInstanceName = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
ParseParamValueInstName(pNextParam, &strInstanceName);
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpDeleteInstance(strInstanceName, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Get Class request
CCimHttpExecQuery * ParseExecQueryMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpExecQuery *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a GetClass reques
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strQuery = NULL;
BSTR strQueryLanguage = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// Process the parameter
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, QUERY_LANGUAGE_PARAM) == 0)
{
pNextParam->get_text(&strQueryLanguage);
}
else if(_wcsicmp(strParamName, QUERY_PARAM) == 0)
{
pNextParam->get_text(&strQuery);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpExecQuery(strQuery, strQueryLanguage, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Get Property request
CCimHttpGetProperty * ParseGetPropertyMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpGetProperty *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a GetInstance reques
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strInstanceName = NULL;
BSTR strPropertyName = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, PROPERTY_NAME_PARAM) == 0)
{
pNextParam->get_text(&strPropertyName);
}
else if(_wcsicmp(strParamName, INSTANCE_NAME_PARAM) == 0)
{
ParseParamValueInstName(pNextParam, &strInstanceName);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpGetProperty(strInstanceName, strPropertyName, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a Set Property request
CCimHttpSetProperty * ParseSetPropertyMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpSetProperty *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a GetInstance reques
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strInstanceName = NULL;
BSTR strPropertyName = NULL;
IXMLDOMNode *pPropertyValue = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, PROPERTY_NAME_PARAM) == 0)
{
pNextParam->get_text(&strPropertyName);
}
else if(_wcsicmp(strParamName, INSTANCE_NAME_PARAM) == 0)
{
ParseParamValueInstName(pNextParam, &strInstanceName);
}
else if(_wcsicmp(strParamName, NEW_VALUE_PARAM) == 0)
{
pNextParam->get_firstChild (&pPropertyValue);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpSetProperty(strInstanceName, strPropertyName,
pPropertyValue, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
if (pPropertyValue)
pPropertyValue->Release ();
pParameters->Release();
}
return pReturnValue;
}
// Parse an Associators request
CCimHttpAssociators * ParseAssociatorsMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpAssociators *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a Enumerate Instances request
//=================================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strObjectName = NULL;
BSTR strAssocClass = NULL;
BSTR strResultClass = NULL;
BSTR strRole = NULL;
BSTR strResultRole = NULL;
BSTR strIncludeQualifiers = NULL;
BSTR strIncludeClassOrigin = NULL;
BSTR *strPropertyList = NULL;
DWORD dwPropCount = 0;
// Set the optional parameters to their defaults
BOOLEAN bIncludeQualifiers = FALSE;
BOOLEAN bIncludeClassOrigin = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, OBJECT_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
// RAJESHR should only be one child
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
BSTR strNodeName2 = NULL;
// CLASSNAME or INSTANCENAME expect
if (SUCCEEDED (pParamValue->get_nodeName (&strNodeName2)))
{
if (_wcsicmp(strNodeName2, CLASS_NAME_PARAM) == 0)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strObjectName);
}
else if (_wcsicmp(strNodeName2, INSTANCE_NAME_PARAM) == 0)
{
ParseInstanceName (pParamValue, &strObjectName);
}
SysFreeString (strNodeName2);
}
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, INCLUDE_QUALIFIERS_PARAM) == 0)
{
pNextParam->get_text(&strIncludeQualifiers);
}
else if(_wcsicmp(strParamName, INCLUDE_CLASS_ORIGIN_PARAM) == 0)
{
pNextParam->get_text(&strIncludeClassOrigin);
}
else if(_wcsicmp(strParamName, ASSOC_CLASS_PARAM) == 0)
{
pNextParam->get_text(&strAssocClass);
}
else if(_wcsicmp(strParamName, RESULT_CLASS_PARAM) == 0)
{
pNextParam->get_text(&strResultClass);
}
else if(_wcsicmp(strParamName, ROLE_PARAM) == 0)
{
pNextParam->get_text(&strRole);
}
else if(_wcsicmp(strParamName, RESULT_ROLE_PARAM) == 0)
{
pNextParam->get_text(&strResultRole);
}
else if(_wcsicmp(strParamName, PROPERTY_LIST_PARAM) == 0)
{
ParsePropertyList(pNextParam, &strPropertyList, &dwPropCount);
}
SysFreeString(strParamName);
}
else
{
// A nameless parameter - just ignore it since
// we're doing loose validation
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// Sort out the parameters created above
if(strIncludeQualifiers && _wcsicmp(strIncludeQualifiers, TRUE_WSTR) == 0)
bIncludeQualifiers = TRUE;
if(strIncludeClassOrigin && _wcsicmp(strIncludeClassOrigin, TRUE_WSTR) == 0)
bIncludeClassOrigin = TRUE;
SysFreeString(strIncludeQualifiers);
SysFreeString(strIncludeClassOrigin);
pReturnValue = new CCimHttpAssociators(strObjectName, strPropertyList, dwPropCount, bIncludeQualifiers, bIncludeClassOrigin,
strAssocClass, strResultClass, strRole, strResultRole, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an AssociatorNames request
CCimHttpAssociatorNames * ParseAssociatorNamesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpAssociatorNames *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters for a Enumerate Instances request
//=================================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strObjectName = NULL;
BSTR strAssocClass = NULL;
BSTR strResultClass = NULL;
BSTR strRole = NULL;
BSTR strResultRole = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, OBJECT_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
// RAJESHR should only be one child
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
BSTR strNodeName2 = NULL;
// CLASSNAME or INSTANCENAME expect
if (SUCCEEDED (pParamValue->get_nodeName (&strNodeName2)))
{
if (_wcsicmp(strNodeName2, CLASS_NAME_PARAM) == 0)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strObjectName);
}
else if (_wcsicmp(strNodeName2, INSTANCE_NAME_PARAM) == 0)
{
ParseInstanceName (pParamValue, &strObjectName);
}
SysFreeString (strNodeName2);
}
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, ASSOC_CLASS_PARAM) == 0)
{
pNextParam->get_text(&strAssocClass);
}
else if(_wcsicmp(strParamName, RESULT_CLASS_PARAM) == 0)
{
pNextParam->get_text(&strResultClass);
}
else if(_wcsicmp(strParamName, ROLE_PARAM) == 0)
{
pNextParam->get_text(&strRole);
}
else if(_wcsicmp(strParamName, RESULT_ROLE_PARAM) == 0)
{
pNextParam->get_text(&strResultRole);
}
SysFreeString(strParamName);
}
else
{
// A nameless parameter - just ignore it since
// we're doing loose validation
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpAssociatorNames(strObjectName,
strAssocClass, strResultClass, strRole,
strResultRole, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an Refrerences request
CCimHttpReferences * ParseReferencesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpReferences *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters
//===============================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strObjectName = NULL;
BSTR strRole = NULL;
BSTR strResultClass = NULL;
BSTR strIncludeQualifiers = NULL;
BSTR strIncludeClassOrigin = NULL;
BSTR *strPropertyList = NULL;
DWORD dwPropCount = 0;
// Set the optional parameters to their defaults
BOOLEAN bIncludeQualifiers = FALSE;
BOOLEAN bIncludeClassOrigin = FALSE;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, OBJECT_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
// RAJESHR should only be one child
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
BSTR strNodeName2 = NULL;
// CLASSNAME or INSTANCENAME expect
if (SUCCEEDED (pParamValue->get_nodeName (&strNodeName2)))
{
if (_wcsicmp(strNodeName2, CLASS_NAME_PARAM) == 0)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strObjectName);
}
else if (_wcsicmp(strNodeName2, INSTANCE_NAME_PARAM) == 0)
{
ParseInstanceName (pParamValue, &strObjectName);
}
SysFreeString (strNodeName2);
}
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, INCLUDE_QUALIFIERS_PARAM) == 0)
{
pNextParam->get_text(&strIncludeQualifiers);
}
else if(_wcsicmp(strParamName, INCLUDE_CLASS_ORIGIN_PARAM) == 0)
{
pNextParam->get_text(&strIncludeClassOrigin);
}
else if(_wcsicmp(strParamName, ROLE_PARAM) == 0)
{
pNextParam->get_text(&strRole);
}
else if(_wcsicmp(strParamName, RESULT_CLASS_PARAM) == 0)
{
pNextParam->get_text(&strResultClass);
}
else if(_wcsicmp(strParamName, PROPERTY_LIST_PARAM) == 0)
{
ParsePropertyList(pNextParam, &strPropertyList, &dwPropCount);
}
SysFreeString(strParamName);
}
else
{
// A nameless parameter - just ignore it since
// we're doing loose validation
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
// Sort out the parameters created above
if(strIncludeQualifiers && _wcsicmp(strIncludeQualifiers, TRUE_WSTR) == 0)
bIncludeQualifiers = TRUE;
if(strIncludeClassOrigin && _wcsicmp(strIncludeClassOrigin, TRUE_WSTR) == 0)
bIncludeClassOrigin = TRUE;
SysFreeString(strIncludeQualifiers);
SysFreeString(strIncludeClassOrigin);
pReturnValue = new CCimHttpReferences(strObjectName, strPropertyList,
dwPropCount, bIncludeQualifiers, bIncludeClassOrigin,
strResultClass, strRole, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse an ReferenceNames request
CCimHttpReferenceNames * ParseReferenceNamesMethod(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpReferenceNames *pReturnValue = NULL;
IXMLDOMNode *pContextObject = NULL;
// Collect the list of parameters
//===============================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
BSTR strLocalNamespace = NULL;
BSTR strObjectName = NULL;
BSTR strRole = NULL;
BSTR strResultClass = NULL;
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
// We dont want to process the LOCALNAMESPACEPATH child node in this loop, only params
if(_wcsicmp(strNodeName, IPARAMVALUE_TAG) == 0)
{
BSTR strParamName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNextParam, NAME_ATTRIBUTE, &strParamName)))
{
if(_wcsicmp(strParamName, OBJECT_NAME_PARAM) == 0)
{
IXMLDOMNode *pParamValue = NULL;
// RAJESHR should only be one child
if (SUCCEEDED(pNextParam->get_firstChild (&pParamValue)) && pParamValue)
{
BSTR strNodeName2 = NULL;
// CLASSNAME or INSTANCENAME expect
if (SUCCEEDED (pParamValue->get_nodeName (&strNodeName2)))
{
if (_wcsicmp(strNodeName2, CLASS_NAME_PARAM) == 0)
{
GetBstrAttribute (pParamValue, NAME_ATTRIBUTE, &strObjectName);
}
else if (_wcsicmp(strNodeName2, INSTANCE_NAME_PARAM) == 0)
{
ParseInstanceName (pParamValue, &strObjectName);
}
SysFreeString (strNodeName2);
}
pParamValue->Release ();
}
}
else if(_wcsicmp(strParamName, ROLE_PARAM) == 0)
{
pNextParam->get_text(&strRole);
}
else if(_wcsicmp(strParamName, RESULT_CLASS_PARAM) == 0)
{
pNextParam->get_text(&strResultClass);
}
SysFreeString(strParamName);
}
}
else if(_wcsicmp(strNodeName, LOCALNAMESPACEPATH_TAG) == 0)
{
ParseLocalNamespacePath(pNextParam, &strLocalNamespace);
}
else if(_wcsicmp(strNodeName, CONTEXTOBJECT_TAG) == 0)
{
pContextObject = pNextParam;pContextObject->AddRef();
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pReturnValue = new CCimHttpReferenceNames(strObjectName,
strResultClass, strRole, strLocalNamespace, strID);
if(pReturnValue)
pReturnValue->SetContextObject(pContextObject);
if(pContextObject)
pContextObject->Release();
pParameters->Release();
}
return pReturnValue;
}
// Parse a IMETHODCALL element
CCimHttpMessage * ParseIMethodCall(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpMessage *pReturnValue = NULL;
bool bIsWhistlerMethod = false;
// See if it is a Whistler Method
BSTR strWMIWhistlerMethod = NULL;
if(SUCCEEDED(GetBstrAttribute(pNode, WMI_ATTRIBUTE, &strWMIWhistlerMethod)))
{
SysFreeString(strWMIWhistlerMethod);
bIsWhistlerMethod = true;
}
BSTR strMethodName = NULL;
if(SUCCEEDED(GetBstrAttribute(pNode, NAME_ATTRIBUTE, &strMethodName)))
{
#ifdef WMI_XML_WHISTLER
if(bIsWhistlerMethod)
{
if(_wcsicmp(strMethodName, GET_OBJECT_METHOD) == 0)
pReturnValue = new CCimWhistlerGetObjectMethod(pNode, strID);
else if(_wcsicmp(strMethodName, ENUMERATE_INSTANCES_METHOD) == 0)
pReturnValue = new CCimWhistlerEnumerateInstancesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, EXEC_QUERY_METHOD) == 0)
pReturnValue = new CCimWhistlerExecQueryMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ENUMERATE_CLASSES_METHOD) == 0)
pReturnValue = new CCimWhistlerEnumerateClassesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, DELETE_CLASS_METHOD) == 0)
pReturnValue = new CCimWhistlerDeleteClassMethod(pNode, strID);
else if (_wcsicmp(strMethodName, DELETE_INSTANCE_METHOD) == 0)
pReturnValue = new CCimWhistlerDeleteInstanceMethod(pNode, strID);
else if (_wcsicmp(strMethodName, CREATE_CLASS_METHOD) == 0)
pReturnValue = new CCimWhistlerCreateClassMethod(pNode, strID);
else if (_wcsicmp(strMethodName, CREATE_INSTANCE_METHOD) == 0)
pReturnValue = new CCimWhistlerCreateInstanceMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ADD_METHOD) == 0)
pReturnValue = new CCimWhistlerAddMethod(pNode, strID);
else if (_wcsicmp(strMethodName, REMOVE_METHOD) == 0)
pReturnValue = new CCimWhistlerRemoveMethod(pNode, strID);
else if (_wcsicmp(strMethodName, RENAME_METHOD) == 0)
pReturnValue = new CCimWhistlerRenameMethod(pNode, strID);
else if (_wcsicmp(strMethodName, GET_OBJECT_SECURITY_METHOD) == 0)
pReturnValue = new CCimWhistlerGetObjectSecurityMethod(pNode, strID);
else if (_wcsicmp(strMethodName, PUT_OBJECT_SECURITY_METHOD) == 0)
pReturnValue = new CCimWhistlerPutObjectSecurityMethod(pNode, strID);
}
else
#endif
{
if(_wcsicmp(strMethodName, GET_CLASS_METHOD) == 0)
pReturnValue = ParseGetClassMethod(pNode, strID);
else if(_wcsicmp(strMethodName, ENUMERATE_INSTANCES_METHOD) == 0)
pReturnValue = ParseEnumerateInstancesMethod(pNode, strID);
else if(_wcsicmp(strMethodName, GET_INSTANCE_METHOD) == 0)
pReturnValue = ParseGetInstanceMethod(pNode, strID);
else if (_wcsicmp(strMethodName, EXEC_QUERY_METHOD) == 0)
pReturnValue = ParseExecQueryMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ENUMERATE_INSTANCENAMES_METHOD) == 0)
pReturnValue = ParseEnumerateInstanceNamesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ENUMERATE_CLASSES_METHOD) == 0)
pReturnValue = ParseEnumerateClassesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ENUMERATE_CLASSNAMES_METHOD) == 0)
pReturnValue = ParseEnumerateClassNamesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, GET_PROPERTY_METHOD) == 0)
pReturnValue = ParseGetPropertyMethod(pNode, strID);
else if (_wcsicmp(strMethodName, SET_PROPERTY_METHOD) == 0)
pReturnValue = ParseSetPropertyMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ASSOCIATORS_METHOD) == 0)
pReturnValue = ParseAssociatorsMethod(pNode, strID);
else if (_wcsicmp(strMethodName, ASSOCIATOR_NAMES_METHOD) == 0)
pReturnValue = ParseAssociatorNamesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, REFERENCES_METHOD) == 0)
pReturnValue = ParseReferencesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, REFERENCE_NAMES_METHOD) == 0)
pReturnValue = ParseReferenceNamesMethod(pNode, strID);
else if (_wcsicmp(strMethodName, DELETE_CLASS_METHOD) == 0)
pReturnValue = ParseDeleteClassMethod(pNode, strID);
else if (_wcsicmp(strMethodName, DELETE_INSTANCE_METHOD) == 0)
pReturnValue = ParseDeleteInstanceMethod(pNode, strID);
else if (_wcsicmp(strMethodName, CREATE_CLASS_METHOD) == 0)
pReturnValue = ParseCreateClassMethod(pNode, strID, FALSE);
else if (_wcsicmp(strMethodName, CREATE_INSTANCE_METHOD) == 0)
pReturnValue = ParseCreateInstanceMethod(pNode, strID);
else if (_wcsicmp(strMethodName, MODIFY_CLASS_METHOD) == 0)
pReturnValue = ParseCreateClassMethod(pNode, strID, TRUE);
else if (_wcsicmp(strMethodName, MODIFY_INSTANCE_METHOD) == 0)
pReturnValue = ParseModifyInstanceMethod(pNode, strID);
}
SysFreeString(strMethodName);
}
return pReturnValue;
}
// Parse a METHODCALL element
CCimHttpMessage * ParseMethodCall(IXMLDOMNode *pNode, BSTR strID)
{
CCimHttpMethod *pReturnValue = NULL;
BSTR strMethodName = NULL;
CParameterMap *pParameterMap = NULL;
BSTR strNamespace = NULL;
BSTR strObjectPath = NULL;
if(pParameterMap = new CParameterMap())
{
// Get the Method Name
if(SUCCEEDED(GetBstrAttribute(pNode, NAME_ATTRIBUTE, &strMethodName)))
{
// Collect the list of parameters for a request
//=======================================================
IXMLDOMNodeList *pParameters = NULL;
if(SUCCEEDED(pNode->get_childNodes(&pParameters)))
{
IXMLDOMNode *pNextParam = NULL;
while(SUCCEEDED(pParameters->nextNode(&pNextParam)) && pNextParam)
{
// Get its name
BSTR strNodeName = NULL;
if(SUCCEEDED(pNextParam->get_nodeName(&strNodeName)))
{
if(_wcsicmp(strNodeName, LOCALINSTANCEPATH_TAG) == 0)
{
ParseLocalInstancePathIntoNsAndInstName(pNextParam, &strNamespace, &strObjectPath);
pReturnValue = new CCimHttpMethod(strMethodName, FALSE, strNamespace, strObjectPath, strID);
}
else if(_wcsicmp(strNodeName, LOCALCLASSPATH_TAG) == 0)
{
ParseLocalClassPathAsNsAndClass(pNextParam, &strNamespace, &strObjectPath);
pReturnValue = new CCimHttpMethod(strMethodName, TRUE, strNamespace, strObjectPath, strID);
}
else if(_wcsicmp(strNodeName, PARAMVALUE_TAG) == 0)
{
IXMLDOMNode *pParameterValue = NULL;
BSTR strParamName = NULL;
if(SUCCEEDED(ParseParamValue(pNextParam, &strParamName, &pParameterValue)) && pParameterValue && strParamName)
pParameterMap->SetAt(strParamName, pParameterValue);
// No need to release pParameterValue.
// It gets released when the parameter map is destroyed
}
SysFreeString(strNodeName);
}
pNextParam->Release();
pNextParam = NULL;
}
pParameters->Release();
}
}
}
if(pReturnValue)
{
pReturnValue->SetInputParameters(pParameterMap);
}
else
{
if(pParameterMap)
CCimHttpMethod::DestroyParameterMap(pParameterMap);
delete pParameterMap;
SysFreeString(strNamespace);
SysFreeString(strObjectPath);
}
return pReturnValue;
}
// Parse a SIMPLEREQ element
CCimHttpMessage * ParseSimpleReq(IXMLDOMNode *pNode, BSTR strID, BOOLEAN bIsMpostRequest, BOOLEAN bIsMicrosoftWMIClient, WMI_XML_HTTP_VERSION iHttpVersion)
{
CCimHttpMessage *pReturnValue = NULL;
// See if the child is an METHODCALL or IMETHODCALL
IXMLDOMNode *pMethodNode = NULL;
if(SUCCEEDED(pNode->get_firstChild(&pMethodNode)) && pMethodNode)
{
BSTR strNodeName = NULL;
if(SUCCEEDED(pMethodNode->get_nodeName(&strNodeName)))
{
if(_wcsicmp(strNodeName, IMETHODCALL_TAG) == 0)
{
pReturnValue = ParseIMethodCall(pMethodNode, strID);
}
else if(_wcsicmp(strNodeName, METHODCALL_TAG) == 0)
{
pReturnValue = ParseMethodCall(pMethodNode, strID);
}
SysFreeString(strNodeName);
}
pMethodNode->Release();
}
if (pReturnValue)
{
pReturnValue->SetIsMpost (bIsMpostRequest);
pReturnValue->SetHttpVersion(iHttpVersion);
pReturnValue->SetMicrosoftClient(bIsMicrosoftWMIClient);
}
return pReturnValue;
}
// Parse a MULTIREQ element
BOOLEAN ParseMultiReq(IXMLDOMNodeList *pReqList, CCimHttpMultiMessage *pMultiRequest, BSTR strID, BOOLEAN bIsMpostRequest, BOOLEAN bIsMicrosoftWMIClient, WMI_XML_HTTP_VERSION iHttpVersion, DWORD dwNumSimpleRequests)
{
pMultiRequest->SetHttpVersion(iHttpVersion);
pMultiRequest->SetMicrosoftClient(bIsMicrosoftWMIClient);
// Allocate an array of pointers
//===============================
CCimHttpMessage **ppSimpleMessages = NULL;
if(ppSimpleMessages = new CCimHttpMessage *[dwNumSimpleRequests])
{
// Initialize each of the pointers in the above array with a simple request object
//================================================================================
IXMLDOMNode *pSimpleReqNode = NULL;
DWORD dwSimpleRequestCount = 0;
BOOLEAN bAllSubNodesParsed = TRUE;
CCimHttpMessage *pNextSimpleRequest = NULL;
while (SUCCEEDED(pReqList->nextNode (&pSimpleReqNode))
&& pSimpleReqNode && bAllSubNodesParsed)
{
// Parse the next simple request
ppSimpleMessages[dwSimpleRequestCount] = NULL;
if(ppSimpleMessages[dwSimpleRequestCount] = ParseSimpleReq(pSimpleReqNode, strID, bIsMpostRequest, bIsMicrosoftWMIClient, iHttpVersion))
{
dwSimpleRequestCount ++;
}
else
{
bAllSubNodesParsed = FALSE;
}
pSimpleReqNode->Release ();
pSimpleReqNode = NULL;
pNextSimpleRequest = NULL;
}
if(bAllSubNodesParsed)
{
// Set the MultiRequest object with this array of SimpleRequest objects
pMultiRequest->SetSimpleRequests(ppSimpleMessages, dwNumSimpleRequests);
return TRUE;
}
else // Deallocate all memory
{
for(DWORD i=0; i<dwSimpleRequestCount; i++)
delete ppSimpleMessages[i];
delete [] ppSimpleMessages;
}
}
return FALSE;
}
//***************************************************************************
//
// BOOLEAN ParseXMLIntoCIMOperation
//
// Description:
//
// Take the XML Document describing the request and execute the
// corresponding WMI operations.
//
// Parameters:
//
// pMessageNode Pointer to the MESSAGE element
// ppReturnObject Holds response message
// pdwStatus Holds HTTP response status on return
// bIsMpostRequest Whether this is M-POST or POST
// bIsMicrosoftWMIClient Whether this is a Microsoft CLient (i.e, the bIsMicrosoftWMIClient header was set)
//
// Return Value:
//
// TRUE if operation executed, FALSE otherwise
//
//***************************************************************************
BOOLEAN ParseXMLIntoCIMOperation(
IXMLDOMNode *pMessageNode,
CCimHttpMessage **ppReturnObject,
DWORD *pdwStatus,
BOOLEAN bIsMpostRequest,
BOOLEAN bIsMicrosoftWMIClient,
WMI_XML_HTTP_VERSION iHttpVersion,
LPSTR *ppszCimError)
{
*ppReturnObject = NULL;
*pdwStatus = 400; // Bad Request by default
*ppszCimError = NULL;
BSTR strIDValue = NULL;
// Get the ProtocolVersion attribute from the MESSAGE element
BSTR bsProtocolVersion = NULL;
if(SUCCEEDED(GetBstrAttribute(pMessageNode, PROTOVERSION_ATTRIBUTE, &bsProtocolVersion)))
{
if (!bsProtocolVersion || (0 != wcscmp (bsProtocolVersion, L"1.0")))
{
*pdwStatus = 501;
*ppszCimError = CIM_UNSUPPORTED_PROTOCOL_VERSION;
}
else
{
// We need its ID attribute
if(SUCCEEDED(GetBstrAttribute(pMessageNode, ID_ATTRIBUTE, &strIDValue)) && strIDValue)
{
// Look for (MULTIREQ|SIMPLEREQ)
IXMLDOMNodeList *pNodeList = NULL;
if (SUCCEEDED(pMessageNode->get_childNodes (&pNodeList)) && pNodeList)
{
// Before we execute anything, check that we have a correct document
// of the form (MULTIREQ|SIMPLEREQ)
IXMLDOMNode *pRequestNode = NULL;
IXMLDOMNode *pCurNode = NULL;
BOOLEAN bFoundReq = FALSE;
BOOLEAN bError = FALSE;
BOOLEAN bIsMultiReq = FALSE;
// Get the Simple or Multi Request Node
//========================================
while (!bFoundReq && SUCCEEDED(pNodeList->nextNode (&pCurNode)) && pCurNode)
{
BSTR bsNodeName = NULL;
if (SUCCEEDED(pCurNode->get_nodeName(&bsNodeName)))
{
if (0 == _wcsicmp(bsNodeName, MULTIREQ_TAG))
{
pRequestNode = pCurNode;
pRequestNode->AddRef ();
bIsMultiReq = TRUE;
bFoundReq = TRUE;
}
else if (0 == _wcsicmp(bsNodeName, SIMPLEREQ_TAG))
{
pRequestNode = pCurNode;
pRequestNode->AddRef ();
bFoundReq = TRUE;
}
SysFreeString (bsNodeName);
}
pCurNode->Release ();
pCurNode = NULL;
}
if (bFoundReq)
{
if (bIsMultiReq)
{
// Create a MULTIREQ object
//============================
IXMLDOMNodeList *pReqList = NULL;
if (SUCCEEDED(pRequestNode->get_childNodes (&pReqList)) && pReqList)
{
// Pass 1 - Count the number of SIMPLEREQ elements in the multi request
// We do loose validation
IXMLDOMNode *pSimpleReqNode = NULL;
DWORD dwSimpleReqCount = 0;
while (SUCCEEDED(pReqList->nextNode (&pSimpleReqNode)) && pSimpleReqNode)
{
BSTR bsReqNodeName = NULL;
if (SUCCEEDED(pSimpleReqNode->get_nodeName(&bsReqNodeName)))
{
if (0 == _wcsicmp(bsReqNodeName, SIMPLEREQ_TAG))
dwSimpleReqCount++;
SysFreeString (bsReqNodeName);
}
pSimpleReqNode->Release ();
pSimpleReqNode = NULL;
}
// Pass 2 - now create a MULTIREQ object
if (SUCCEEDED(pReqList->reset()))
{
if(*ppReturnObject = new
CCimHttpMultiMessage (strIDValue, bIsMpostRequest))
{
if(!ParseMultiReq(pReqList, (CCimHttpMultiMessage *)*ppReturnObject, strIDValue, bIsMpostRequest, bIsMicrosoftWMIClient, iHttpVersion, dwSimpleReqCount))
{
delete *ppReturnObject;
*ppReturnObject = NULL;
}
else
*pdwStatus = 200;
}
else
*pdwStatus = 500;
}
pReqList->Release ();
}
}
else
{
// Create a SIMPLEREQ object
//============================
*ppReturnObject = ParseSimpleReq(pRequestNode, strIDValue,
bIsMpostRequest, bIsMicrosoftWMIClient, iHttpVersion);
if(*ppReturnObject)
*pdwStatus = 200;
}
}
if (pRequestNode)
pRequestNode->Release ();
pNodeList->Release();
}
}
}
SysFreeString (bsProtocolVersion);
}
// If an object was not constructed, then strIDValue needs to be released
// Note that the strIDValue becomes a property of the request object since
// its constructor does not make a copy
if(!(*ppReturnObject))
{
SysFreeString (strIDValue);
if(*pdwStatus == 400)
*ppszCimError = CIM_REQUEST_NOT_VALID;
}
return TRUE;
}
//***************************************************************************
//
// IXMLDOMNode *GetMessageNode
//
// Description:
//
// Take the XML Document describing the request and extract the
// unique MESSAGE node.
//
// Parameters:
//
// pDocument Holds request in XML document form
// pdwStatus Holds HTTP response status on return
//
// Return Value:
//
// pointer to the node (or NULL if error)
//
//***************************************************************************
IXMLDOMNode *GetMessageNode(
IXMLDOMDocument *pDocument,
DWORD *pdwStatus,
LPSTR *ppszErrorHeaders
)
{
IXMLDOMNode *pMessage = NULL;
BOOLEAN bError = FALSE;
*ppszErrorHeaders = NULL;
*pdwStatus = 500;
// Get the XML Element at the top of the document
IXMLDOMElement *pDocumentElement = NULL;
if (SUCCEEDED(pDocument->get_documentElement(&pDocumentElement)) && pDocumentElement)
{
BSTR bsNodeName = NULL;
// This root element should be the "CIM" Element
if (SUCCEEDED(pDocumentElement->get_nodeName(&bsNodeName)) &&
(0 == _wcsicmp (CIM_TAG, bsNodeName)))
{
// We found the root element - check the attributes
// CIM Version
BSTR bsCIMVersion = NULL;
GetBstrAttribute (pDocumentElement, CIMVERSION_ATTRIBUTE, &bsCIMVersion);
if(bsCIMVersion && _wcsicmp(bsCIMVersion, L"2.0") == 0)
{
// DTD Version
BSTR bsDTDVersion = NULL;
GetBstrAttribute (pDocumentElement, DTDVERSION_ATTRIBUTE, &bsDTDVersion);
if(bsDTDVersion && _wcsicmp(bsDTDVersion, L"2.0") == 0)
{
// Now look for the MESSAGE tag
IXMLDOMNodeList *pNodeList2 = NULL;
if (SUCCEEDED(pDocumentElement->get_childNodes(&pNodeList2)) && pNodeList2)
{
IXMLDOMNode *pMessageNode = NULL;
bool bFoundMessage = false;
while (!bFoundMessage && SUCCEEDED(pNodeList2->nextNode (&pMessageNode))
&& pMessageNode)
{
BSTR bsNodeName2 = NULL;
// Next node should be the <MESSAGE> tag
if (SUCCEEDED(pMessageNode->get_nodeName(&bsNodeName2)) &&
(0 == _wcsicmp (MESSAGE_TAG, bsNodeName2)))
{
pMessage = pMessageNode;
pMessage->AddRef ();
bFoundMessage = true;
}
SysFreeString(bsNodeName2);
pMessageNode->Release();
pMessageNode = NULL;
}
pNodeList2->Release ();
}
}
else
{
bError = TRUE;
*pdwStatus = 501;
*ppszErrorHeaders = CIM_UNSUPPORTED_DTD_VERSION;
}
SysFreeString(bsDTDVersion);
}
else
{
bError = TRUE;
*pdwStatus = 501;
*ppszErrorHeaders = CIM_UNSUPPORTED_CIM_VERSION;
}
SysFreeString(bsCIMVersion);
}
else
{
bError = TRUE;
*pdwStatus = 400;
*ppszErrorHeaders = CIM_REQUEST_NOT_VALID;
}
SysFreeString(bsNodeName);
pDocumentElement->Release();
}
else
{
bError = TRUE;
*pdwStatus = 400;
*ppszErrorHeaders = CIM_REQUEST_NOT_VALID;
}
// If we had some error and still have a message node, then release it
if (bError && pMessage)
{
pMessage->Release ();
pMessage = NULL;
}
// If we found no error, but also no message node, then create an error
else if(!bError && !pMessage)
{
*pdwStatus = 400;
*ppszErrorHeaders = CIM_REQUEST_NOT_VALID;
}
return pMessage;
}