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

623 lines
16 KiB
C++

//***************************************************************************
//
// Copyright (c) 1997-1999 Microsoft Corporation
//
// REQUEST.H
//
// rajeshr 3/25/2000 Created.
//
// Contains the classes that model the various operations that can be done on
// a CIMOM using the XML/HTTP transport
//
//***************************************************************************
#ifndef CIM_HTTP_REQUEST_H
#define CIM_HTTP_REQUEST_H
// A Macro to write newlines in the XML stream for readability TODO - remove this before release
#ifdef WMIXML_DONL
#define WRITENL(theStream) theStream->Write (NEWLINE, 4, NULL);
#else
#define WRITENL(theStream)
#endif
/*
* This is the base class of all XML/HTTP requests
* It contains the HTTP Version of the request, the ID of the request
* whether the client is a Microsoft one, whether the request is a
* POST or M-POSTand so on
*/
class CCimHttpMessage
{
protected:
WMI_XML_HTTP_VERSION m_iHttpVersion; // The HTTP Version of the request
BSTR m_strID; // The Message ID of the request
IStream *m_pHeaderStream; // The stream on to which any headers in the response are written
IStream *m_pTrailerStream; // The stream on to which any trailers in the response are written
CHAR *m_httpStatus; // The HTTP status after the request has been handled
HRESULT m_WMIStatus; // Any HRESULT that is returned after interacting with WMI
BOOL m_bIsMpostRequest; // Whether this is an M-POST request
IWbemContext *m_pFlagsContext; // A Context object that holds the flags that must be passed to the WMI-XML convertor
BOOL m_bIsMicrosoftWMIClient; // Whether this is a Microsoft client
HRESULT TalkToWinMgmtAndPrepareResponse(LPEXTENSION_CONTROL_BLOCK pECB);
virtual HRESULT PrepareCommonHeaders();
virtual HRESULT PrepareCommonTrailersAndWriteToSocket(LPEXTENSION_CONTROL_BLOCK pECB);
virtual WCHAR *GetMethodName() = 0;
BOOL SendHTTPHeaders(LPEXTENSION_CONTROL_BLOCK pECB,
LPCSTR pszStatus, LPCSTR pszHeader);
HRESULT SetBoolProperty(LPCWSTR pszName, BOOL bValue);
public:
CCimHttpMessage(BSTR strID, BOOL bIsMpostRequest);
virtual ~CCimHttpMessage();
virtual HRESULT Initialize();
virtual HRESULT PrepareResponseBody(IStream *pPrefixStream, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB) = 0;
virtual HRESULT EncodeErrorObject(HRESULT result);
virtual void WriteMethodHeader() = 0;
virtual void WriteMethodTrailer() = 0;
const BSTR GetID() const
{
return m_strID;
}
void SetIsMpost (BOOL bIsMpostRequest)
{
m_bIsMpostRequest = bIsMpostRequest;
}
void SetHttpVersion(WMI_XML_HTTP_VERSION iHttpVersion)
{
m_iHttpVersion = iHttpVersion;
}
void SetMicrosoftClient(BOOL bIsMicrosoftWMIClient)
{
m_bIsMicrosoftWMIClient = bIsMicrosoftWMIClient;
}
virtual HRESULT CreateFlagsContext();
virtual HRESULT EncodeNormalResponse(LPEXTENSION_CONTROL_BLOCK pECB);
};
// This class models a non-Whistler CIM HTTP request
class CCimDMTFOrNovaMessage : public CCimHttpMessage
{
protected:
IXMLDOMNode *m_pContextNode;
public:
CCimDMTFOrNovaMessage :: CCimDMTFOrNovaMessage(BSTR pszID, BOOL bIsMpostRequest = FALSE)
: CCimHttpMessage(pszID, bIsMpostRequest)
{
m_pContextNode = NULL;
}
virtual ~CCimDMTFOrNovaMessage()
{
if(m_pContextNode)
m_pContextNode->Release();
}
void SetContextObject(IXMLDOMNode *pContextNode)
{
if (m_pContextNode)
m_pContextNode->Release();
m_pContextNode = pContextNode;
if (m_pContextNode)
m_pContextNode->AddRef();
}
};
// This class models a MULTIREQUEST
class CCimHttpMultiMessage : public CCimHttpMessage
{
virtual HRESULT PrepareResponseBody(IStream *pPrefixStream, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB) { return S_OK; }
virtual WCHAR *GetMethodName() { return NULL; }
virtual void WriteMethodHeader() {}
virtual void WriteMethodTrailer() {}
CCimHttpMessage **m_ppSimpleMessages; // Array of pointers to CCimhttpMessage objects
DWORD m_dwSimpleMessageCount; // Number of pointers in the above array
public:
CCimHttpMultiMessage (BSTR strID, BOOL bIsMpostRequest);
virtual ~CCimHttpMultiMessage ();
void SetSimpleRequests(CCimHttpMessage **ppSimpleMessages, DWORD dwSimpleMessageCount);
CCimHttpMessage **GetSimpleRequests(DWORD *pdwSimpleMessageCount);
virtual HRESULT EncodeNormalResponse(LPEXTENSION_CONTROL_BLOCK pECB);
};
// This class models an Intrinsic method request
class CCimHttpIMethod : public CCimDMTFOrNovaMessage
{
protected:
BSTR m_strNamespace;
LONG m_lFlags;
public:
CCimHttpIMethod(BSTR strNamespace, BSTR strID);
virtual ~CCimHttpIMethod();
const BSTR GetNamespace() const
{
return m_strNamespace;
}
virtual void WriteMethodHeader();
virtual void WriteMethodTrailer ();
void SetFlags(LONG lFlags)
{
m_lFlags = lFlags;
}
};
// This class models an Extrinsic method request
class CCimHttpMethod : public CCimHttpIMethod
{
protected:
BSTR m_strMethodName;
BSTR m_strObjectPath;
BOOLEAN m_isStatic;
CParameterMap *m_pInputParameters;
public:
CCimHttpMethod(BSTR strMethodName, BOOLEAN isStatic, BSTR strNamespace, BSTR strObjectPath, BSTR strID);
virtual ~CCimHttpMethod();
WCHAR *GetMethodName()
{
return m_strMethodName;
}
static void DestroyParameterMap(CParameterMap *pParameters);
const BSTR GetObjectPath() const
{
return m_strObjectPath;
}
const CParameterMap * GetInputParameters() const
{
return m_pInputParameters;
}
void SetInputParameters(CParameterMap * pInputParameters)
{
if(m_pInputParameters)
DestroyParameterMap(m_pInputParameters);
m_pInputParameters = pInputParameters;
}
virtual HRESULT PrepareResponseBody(IStream *pPrefixStream, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
virtual void WriteMethodHeader();
virtual void WriteMethodTrailer();
};
class CCimHttpGetClass : public CCimHttpIMethod
{
protected:
BSTR m_strClassName;
BOOLEAN m_bLocalOnly;
BOOLEAN m_bIncludeQualifiers;
BOOLEAN m_bIncludeClassOrigin;
BSTR *m_strPropertyList;
DWORD m_dwPropCount;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
virtual HRESULT CreateFlagsContext();
public:
CCimHttpGetClass(BSTR strClassName, BSTR *pstrPropertyList, DWORD dwPropCount,
BOOLEAN bLocalOnly, BOOLEAN bIncludeQualifiers, BOOLEAN bIncludeClassOrigin,
BSTR strNamespace, BSTR strID);
virtual ~CCimHttpGetClass();
const BSTR GetClassName() const
{
return m_strClassName;
}
BOOLEAN IsLocalOnly() const
{
return m_bLocalOnly;
}
WCHAR *GetMethodName ()
{
return L"GetClass";
}
};
class CCimHttpCreateClass : public CCimHttpIMethod
{
private:
BOOL m_bIsModify;
protected:
IXMLDOMNode *m_pClass;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpCreateClass(IXMLDOMNode *m_pClass, BSTR strNamespace, BSTR strID,
BOOL bIsModify);
virtual ~CCimHttpCreateClass();
WCHAR *GetMethodName ()
{
return (m_bIsModify) ? L"ModifyClass" : L"CreateClass";
}
};
class CCimHttpDeleteClass : public CCimHttpIMethod
{
protected:
BSTR m_strClassName;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpDeleteClass(BSTR strClassName, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpDeleteClass();
const BSTR GetClassName() const
{
return m_strClassName;
}
WCHAR *GetMethodName ()
{
return L"DeleteClass";
}
};
class CCimHttpCreateInstance : public CCimHttpIMethod
{
protected:
IXMLDOMNode *m_pInstance;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
WCHAR *GetMethodName ()
{
return L"CreateInstance";
}
public:
CCimHttpCreateInstance(IXMLDOMNode *m_pInstance, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpCreateInstance();
};
class CCimHttpModifyInstance : public CCimHttpIMethod
{
protected:
IXMLDOMNode *m_pInstance;
BSTR m_bsInstanceName;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
WCHAR *GetMethodName ()
{
return L"ModifyInstance";
}
public:
CCimHttpModifyInstance(IXMLDOMNode *m_pInstance,
BSTR strInstanceName, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpModifyInstance();
};
class CCimHttpDeleteInstance : public CCimHttpIMethod
{
protected:
BSTR m_strInstanceName;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpDeleteInstance(BSTR strInstanceName, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpDeleteInstance();
const BSTR GetInstanceName() const
{
return m_strInstanceName;
}
WCHAR *GetMethodName ()
{
return L"DeleteInstance";
}
};
class CCimHttpEnumerateClasses : public CCimHttpGetClass
{
protected:
BOOLEAN m_bDeepInheritance;
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpEnumerateClasses(BSTR strClassName, BSTR *strPropertyList, DWORD dwCount, BOOLEAN bDeepInheritance, BOOLEAN bLocalOnly, BOOLEAN bIncludeQualifiers, BOOLEAN bIncludeClassOrigin, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpEnumerateClasses() {}
BOOLEAN IsDeepInheritance() const
{
return m_bDeepInheritance;
}
WCHAR *GetMethodName ()
{
return L"EnumerateClasses";
}
};
class CCimHttpEnumerateInstances : public CCimHttpGetClass
{
protected:
BOOLEAN m_bDeepInheritance;
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpEnumerateInstances(BSTR strClassName, BSTR *strPropertyList, DWORD dwCount, BOOLEAN bDeepInheritance, BOOLEAN bLocalOnly, BOOLEAN bIncludeQualifiers, BOOLEAN bIncludeClassOrigin, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpEnumerateInstances() {}
BOOLEAN IsDeepInheritance() const
{
return m_bDeepInheritance;
}
WCHAR *GetMethodName ()
{
return L"EnumerateInstances";
}
};
class CCimHttpEnumerateInstanceNames : public CCimHttpIMethod
{
private:
BSTR m_strClassName;
protected:
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpEnumerateInstanceNames(BSTR strClassName, BSTR strNamespace, BSTR strID)
: CCimHttpIMethod (strNamespace, strID)
{
m_strClassName = strClassName;
}
virtual ~CCimHttpEnumerateInstanceNames()
{
if (m_strClassName)
SysFreeString (m_strClassName);
}
WCHAR *GetMethodName ()
{
return L"EnumerateInstanceNames";
}
};
class CCimHttpEnumerateClassNames : public CCimHttpIMethod
{
private:
BSTR m_strClassName;
BOOL m_bDeepInheritance;
protected:
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpEnumerateClassNames(BSTR strClassName, BSTR strNamespace,
BOOL bDeepInheritanceValue, BSTR strID)
: CCimHttpIMethod (strNamespace, strID)
{
m_strClassName = strClassName;
m_bDeepInheritance = bDeepInheritanceValue;
}
virtual ~CCimHttpEnumerateClassNames()
{
if (m_strClassName)
SysFreeString (m_strClassName);
}
WCHAR *GetMethodName ()
{
return L"EnumerateClassNames";
}
};
class CCimHttpGetInstance : public CCimHttpGetClass
{
protected:
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpGetInstance(BSTR strInstanceName, BSTR *pstrPropertyList, DWORD dwPropCount,
BOOLEAN bLocalOnly, BOOLEAN bIncludeQualifiers, BOOLEAN bIncludeClassOrigin,
BSTR strNamespace, BSTR strID);
virtual ~CCimHttpGetInstance() {}
WCHAR *GetMethodName ()
{
return L"GetInstance";
}
};
class CCimHttpExecQuery : public CCimHttpIMethod
{
protected:
BSTR m_strQuery;
BSTR m_strQueryLanguage;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpExecQuery(BSTR m_strQuery, BSTR m_strQueryLanguage, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpExecQuery();
const BSTR GetQuery() const
{
return m_strQuery;
}
const BSTR GetQueryLanguage() const
{
return m_strQueryLanguage;
}
WCHAR *GetMethodName ()
{
return L"ExecQuery";
}
HRESULT CreateFlagsContext();
};
class CCimHttpGetProperty : public CCimHttpIMethod
{
protected:
BSTR m_strInstanceName;
BSTR m_strPropertyName;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpGetProperty(BSTR strInstanceName, BSTR strPropertyName, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpGetProperty();
const BSTR GetInstanceName() const
{
return m_strInstanceName;
}
WCHAR *GetMethodName ()
{
return L"GetProperty";
}
};
class CCimHttpSetProperty : public CCimHttpIMethod
{
protected:
BSTR m_strInstanceName;
BSTR m_strPropertyName;
IXMLDOMNode *m_pPropertyValue;
virtual HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpSetProperty(BSTR strInstanceName, BSTR strPropertyName,
IXMLDOMNode *pPropertyValue, BSTR strNamespace, BSTR strID);
virtual ~CCimHttpSetProperty();
const BSTR GetInstanceName() const
{
return m_strInstanceName;
}
WCHAR *GetMethodName ()
{
return L"SetProperty";
}
};
class CCimHttpAssociators : public CCimHttpGetClass
{
protected:
BSTR m_strAssocClass;
BSTR m_strResultClass;
BSTR m_strRole;
BSTR m_strResultRole;
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpAssociators (BSTR strClassName, BSTR *strPropertyList, DWORD dwCount,
BOOLEAN bIncludeQualifiers, BOOLEAN bIncludeClassOrigin,
BSTR strAssocClass, BSTR strResultClass, BSTR strRole, BSTR strResultRole,
BSTR strNamespace, BSTR strID);
virtual ~CCimHttpAssociators();
WCHAR *GetMethodName ()
{
return L"Associators";
}
};
class CCimHttpAssociatorNames : public CCimHttpIMethod
{
protected:
BSTR m_strObjectName;
BSTR m_strAssocClass;
BSTR m_strResultClass;
BSTR m_strRole;
BSTR m_strResultRole;
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpAssociatorNames (BSTR strObjectName,
BSTR strAssocClass, BSTR strResultClass, BSTR strRole, BSTR strResultRole,
BSTR strNamespace, BSTR strID);
virtual ~CCimHttpAssociatorNames();
WCHAR *GetMethodName ()
{
return L"AssociatorNames";
}
};
class CCimHttpReferences : public CCimHttpGetClass
{
protected:
BSTR m_strRole;
BSTR m_strResultClass;
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpReferences (BSTR strClassName, BSTR *strPropertyList, DWORD dwCount,
BOOLEAN bIncludeQualifiers, BOOLEAN bIncludeClassOrigin,
BSTR strResultClass, BSTR strRole,
BSTR strNamespace, BSTR strID);
virtual ~CCimHttpReferences();
WCHAR *GetMethodName ()
{
return L"References";
}
};
class CCimHttpReferenceNames : public CCimHttpIMethod
{
protected:
BSTR m_strObjectName;
BSTR m_strRole;
BSTR m_strResultClass;
HRESULT PrepareResponseBody(IStream *pPrefixStrean, IStream *pSuffixStream, LPEXTENSION_CONTROL_BLOCK pECB);
public:
CCimHttpReferenceNames (BSTR strClassName,
BSTR strResultClass, BSTR strRole,
BSTR strNamespace, BSTR strID);
virtual ~CCimHttpReferenceNames();
WCHAR *GetMethodName ()
{
return L"ReferenceNames";
}
};
#endif