267 lines
6.9 KiB
C++
267 lines
6.9 KiB
C++
#ifndef WMI_XML_DOC_SET
|
|
#define WMI_XML_DOC_SET
|
|
|
|
// This is a class that implements the ISWbemXMLDocumentSet scriptable interface
|
|
// over an IStream. The IStream is assumed to contain a response to an
|
|
// Enumeration, Query etc.
|
|
class CWbemXMLHTTPDocSet : public ISWbemXMLDocumentSet,
|
|
public ISupportErrorInfo,
|
|
public IEnumVARIANT
|
|
{
|
|
private:
|
|
MyFactory *m_pFactory; // The factory used to construct objects
|
|
IXMLParser *m_pParser; // The parser used by the factory
|
|
|
|
protected:
|
|
long m_cRef; //Object reference count
|
|
CDispatchHelp m_Dispatch;
|
|
|
|
public:
|
|
|
|
CWbemXMLHTTPDocSet();
|
|
virtual ~CWbemXMLHTTPDocSet();
|
|
|
|
//Non-delegating object IUnknown
|
|
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv = reinterpret_cast<IUnknown*>(this);
|
|
else if (IID_ISWbemXMLDocumentSet==riid)
|
|
*ppv = (ISWbemXMLDocumentSet *)this;
|
|
else if (IID_ISupportErrorInfo==riid)
|
|
*ppv = (ISupportErrorInfo *)this;
|
|
else if (IID_IDispatch==riid)
|
|
*ppv = (IDispatch *)this;
|
|
else if (IID_IEnumVARIANT==riid)
|
|
*ppv = (IEnumVARIANT *)this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void)
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) Release(void)
|
|
{
|
|
InterlockedDecrement(&m_cRef);
|
|
if (0L!=m_cRef)
|
|
return m_cRef;
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
// IDispatch
|
|
STDMETHODIMP GetTypeInfoCount(UINT* pctinfo)
|
|
{return m_Dispatch.GetTypeInfoCount(pctinfo);}
|
|
STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
|
|
{return m_Dispatch.GetTypeInfo(itinfo, lcid, pptinfo);}
|
|
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames,
|
|
UINT cNames, LCID lcid, DISPID* rgdispid)
|
|
{return m_Dispatch.GetIDsOfNames(riid, rgszNames, cNames,
|
|
lcid,
|
|
rgdispid);}
|
|
STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid,
|
|
WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
|
|
EXCEPINFO* pexcepinfo, UINT* puArgErr)
|
|
{return m_Dispatch.Invoke(dispidMember, riid, lcid, wFlags,
|
|
pdispparams, pvarResult, pexcepinfo, puArgErr);}
|
|
|
|
// Collection methods
|
|
HRESULT STDMETHODCALLTYPE get__NewEnum
|
|
(
|
|
/*[out]*/ IUnknown **ppUnk
|
|
);
|
|
HRESULT STDMETHODCALLTYPE get_Count
|
|
(
|
|
/*[out]*/ long *plCount
|
|
);
|
|
HRESULT STDMETHODCALLTYPE Item
|
|
(
|
|
/*[in]*/ BSTR objectPath,
|
|
/*[in]*/ long lFlags,
|
|
/*[out]*/ IXMLDOMDocument **ppDocument
|
|
);
|
|
|
|
// IEnumVARIANT methods
|
|
HRESULT STDMETHODCALLTYPE Reset
|
|
();
|
|
|
|
HRESULT STDMETHODCALLTYPE Next
|
|
(
|
|
/*[in]*/ unsigned long celt,
|
|
/*[out]*/ VARIANT FAR *rgvar,
|
|
/*[out]*/ unsigned long FAR *pceltFetched
|
|
);
|
|
|
|
HRESULT STDMETHODCALLTYPE Clone
|
|
(
|
|
/*[out]*/ IEnumVARIANT **ppEnum
|
|
);
|
|
|
|
HRESULT STDMETHODCALLTYPE Skip
|
|
(
|
|
/*[in]*/ unsigned long celt
|
|
);
|
|
|
|
// ISupportErrorInfo methods
|
|
HRESULT STDMETHODCALLTYPE InterfaceSupportsErrorInfo
|
|
(
|
|
/* [in] */ REFIID riid
|
|
);
|
|
|
|
HRESULT STDMETHODCALLTYPE NextDocument (IXMLDOMDocument **ppDoc);
|
|
HRESULT STDMETHODCALLTYPE SkipNextDocument ();
|
|
|
|
HRESULT Initialize(IStream *pStream, LPCWSTR *ppszElementNames, DWORD dwElementCount);
|
|
};
|
|
|
|
// This is a class that implements the ISWbemXMLDocumentSet scriptable interface
|
|
// over an IEnumWbemClassObject. T
|
|
class CWbemDCOMDocSet : public ISWbemXMLDocumentSet,
|
|
public ISupportErrorInfo,
|
|
public IEnumVARIANT
|
|
{
|
|
private:
|
|
IEnumWbemClassObject *m_pEnum;
|
|
VARIANT_BOOL m_bLocalOnly;
|
|
VARIANT_BOOL m_bIncludeQualifiers;
|
|
VARIANT_BOOL m_bIncludeClassOrigin;
|
|
bool m_bNamesOnly;
|
|
WmiXMLEncoding m_iEncoding;
|
|
|
|
protected:
|
|
long m_cRef; //Object reference count
|
|
CDispatchHelp m_Dispatch;
|
|
|
|
public:
|
|
|
|
CWbemDCOMDocSet();
|
|
virtual ~CWbemDCOMDocSet();
|
|
|
|
//Non-delegating object IUnknown
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
|
|
{
|
|
*ppv=NULL;
|
|
|
|
if (IID_IUnknown==riid)
|
|
*ppv = reinterpret_cast<IUnknown*>(this);
|
|
else if (IID_ISWbemXMLDocumentSet==riid)
|
|
*ppv = (ISWbemXMLDocumentSet *)this;
|
|
else if (IID_ISupportErrorInfo==riid)
|
|
*ppv = (ISupportErrorInfo *)this;
|
|
else if (IID_IDispatch==riid)
|
|
*ppv = (IDispatch *)this;
|
|
else if (IID_IEnumVARIANT==riid)
|
|
*ppv = (IEnumVARIANT *)this;
|
|
|
|
if (NULL!=*ppv)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return NOERROR;
|
|
}
|
|
|
|
return ResultFromScode(E_NOINTERFACE);
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) AddRef(void)
|
|
{
|
|
InterlockedIncrement(&m_cRef);
|
|
return m_cRef;
|
|
}
|
|
|
|
STDMETHODIMP_(ULONG) Release(void)
|
|
{
|
|
InterlockedDecrement(&m_cRef);
|
|
if (0L!=m_cRef)
|
|
return m_cRef;
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
// IDispatch
|
|
STDMETHODIMP GetTypeInfoCount(UINT* pctinfo)
|
|
{return m_Dispatch.GetTypeInfoCount(pctinfo);}
|
|
STDMETHODIMP GetTypeInfo(UINT itinfo, LCID lcid, ITypeInfo** pptinfo)
|
|
{return m_Dispatch.GetTypeInfo(itinfo, lcid, pptinfo);}
|
|
STDMETHODIMP GetIDsOfNames(REFIID riid, OLECHAR** rgszNames,
|
|
UINT cNames, LCID lcid, DISPID* rgdispid)
|
|
{return m_Dispatch.GetIDsOfNames(riid, rgszNames, cNames,
|
|
lcid,
|
|
rgdispid);}
|
|
STDMETHODIMP Invoke(DISPID dispidMember, REFIID riid, LCID lcid,
|
|
WORD wFlags, DISPPARAMS* pdispparams, VARIANT* pvarResult,
|
|
EXCEPINFO* pexcepinfo, UINT* puArgErr)
|
|
{return m_Dispatch.Invoke(dispidMember, riid, lcid, wFlags,
|
|
pdispparams, pvarResult, pexcepinfo, puArgErr);}
|
|
|
|
// Collection methods
|
|
HRESULT STDMETHODCALLTYPE get__NewEnum
|
|
(
|
|
/*[out]*/ IUnknown **ppUnk
|
|
);
|
|
HRESULT STDMETHODCALLTYPE get_Count
|
|
(
|
|
/*[out]*/ long *plCount
|
|
);
|
|
HRESULT STDMETHODCALLTYPE Item
|
|
(
|
|
/*[in]*/ BSTR objectPath,
|
|
/*[in]*/ long lFlags,
|
|
/*[out]*/ IXMLDOMDocument **ppDocument
|
|
);
|
|
|
|
// IEnumVARIANT methods
|
|
HRESULT STDMETHODCALLTYPE Reset
|
|
();
|
|
|
|
HRESULT STDMETHODCALLTYPE Next
|
|
(
|
|
/*[in]*/ unsigned long celt,
|
|
/*[out]*/ VARIANT FAR *rgvar,
|
|
/*[out]*/ unsigned long FAR *pceltFetched
|
|
);
|
|
|
|
HRESULT STDMETHODCALLTYPE Clone
|
|
(
|
|
/*[out]*/ IEnumVARIANT **ppEnum
|
|
);
|
|
|
|
HRESULT STDMETHODCALLTYPE Skip
|
|
(
|
|
/*[in]*/ unsigned long celt
|
|
);
|
|
|
|
// ISupportErrorInfo methods
|
|
HRESULT STDMETHODCALLTYPE InterfaceSupportsErrorInfo
|
|
(
|
|
/* [in] */ REFIID riid
|
|
);
|
|
|
|
// Other methods
|
|
HRESULT STDMETHODCALLTYPE NextDocument (IXMLDOMDocument **ppDoc);
|
|
HRESULT STDMETHODCALLTYPE SkipNextDocument ();
|
|
|
|
HRESULT Initialize(IEnumWbemClassObject *pEnum,
|
|
WmiXMLEncoding iEncoding,
|
|
VARIANT_BOOL bIncludeQualifiers,
|
|
VARIANT_BOOL bIncludeClassOrigin,
|
|
VARIANT_BOOL bLocalOnly,
|
|
bool bNamesOnly);
|
|
};
|
|
|
|
|
|
|
|
|
|
#endif |