windows-nt/Source/XPSP1/NT/admin/pchealth/helpctr/service/include/datacollection.h
2020-09-26 16:20:57 +08:00

289 lines
12 KiB
C++

/******************************************************************************
Copyright (c) 1999 Microsoft Corporation
Module Name:
DataCollection.h
Abstract:
This file contains the declaration of the classes used to implement
the Data Collection system.
Revision History:
Davide Massarenti (Dmassare) 07/21/99
created
******************************************************************************/
#if !defined(__INCLUDED___SAF___DATACOLLECTION_H___)
#define __INCLUDED___SAF___DATACOLLECTION_H___
#include <MPC_COM.h>
#include <MPC_security.h>
#include <WMIParser.h>
#include <History.h>
/////////////////////////////////////////////////////////////////////////////
//
// Forward declarations.
//
class CSAFDataCollection;
class CSAFDataCollectionReport;
class CSAFDataCollectionEvents;
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CSAFDataCollectionReport : // Hungarian: hchdcr
public CComObjectRootEx<MPC::CComSafeMultiThreadModel>,
public IDispatchImpl<ISAFDataCollectionReport, &IID_ISAFDataCollectionReport, &LIBID_HelpServiceTypeLib>
{
friend CSAFDataCollection;
CComBSTR m_bstrNamespace;
CComBSTR m_bstrClass;
CComBSTR m_bstrWQL;
DWORD m_dwErrorCode;
CComBSTR m_bstrDescription;
public:
BEGIN_COM_MAP(CSAFDataCollectionReport)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISAFDataCollectionReport)
END_COM_MAP()
CSAFDataCollectionReport();
// ISAFDataCollectionReport
STDMETHOD(get_Namespace )( /*[out, retval]*/ BSTR *pValURL );
STDMETHOD(get_Class )( /*[out, retval]*/ BSTR *pValTitle );
STDMETHOD(get_WQL )( /*[out, retval]*/ BSTR *pValLastVisited);
STDMETHOD(get_ErrorCode )( /*[out, retval]*/ long *pValDuration );
STDMETHOD(get_Description)( /*[out, retval]*/ BSTR *pValNumOfHits );
};
/////////////////////////////////////////////////////////////////////////////
class ATL_NO_VTABLE CSAFDataCollection : // Hungarian: hcpdc
public MPC::Thread < CSAFDataCollection, ISAFDataCollection >,
public MPC::ConnectionPointImpl< CSAFDataCollection, &DIID_DSAFDataCollectionEvents, MPC::CComSafeMultiThreadModel >,
public IDispatchImpl < ISAFDataCollection, &IID_ISAFDataCollection, &LIBID_HelpServiceTypeLib >
{
typedef std::list< WMIParser::Snapshot* > QueryResults;
typedef QueryResults::iterator QueryResultsIter;
typedef QueryResults::const_iterator QueryResultsIterConst;
typedef std::list< CSAFDataCollectionReport* > List;
typedef List::iterator Iter;
typedef List::const_iterator IterConst;
private:
MPC::Impersonation m_imp;
DC_STATUS m_dsStatus;
long m_lPercent;
DWORD m_dwErrorCode;
bool m_fScheduled; // Internal flag indicating that this is a low-priority, scheduled data collection.
bool m_fCompleted; // Internal flag indicating that someone has already called Fire_onComplete.
bool m_fWorking; // Internal flag indicating that an operation is currently performed.
List m_lstReports;
CSAFDataCollectionReport* m_hcpdcrcCurrentReport;
CComBSTR m_bstrMachineData;
CComBSTR m_bstrHistory;
long m_lHistory;
CComPtr<IStream> m_streamMachineData;
CComPtr<IStream> m_streamHistory;
CComBSTR m_bstrFilenameT0;
CComBSTR m_bstrFilenameT1;
CComBSTR m_bstrFilenameDiff;
CComPtr<IDispatch> m_sink_onStatusChange;
CComPtr<IDispatch> m_sink_onProgress;
CComPtr<IDispatch> m_sink_onComplete;
long m_lQueries_Done;
long m_lQueries_Total;
static void CleanQueryResult( QueryResults& qr );
static HRESULT StreamFromXML( /*[in]*/ IXMLDOMDocument* xdd, /*[in]*/ bool fDelete, /*[in/out]*/ CComPtr<IStream>& val );
void EraseReports ();
void StartOperations();
void StopOperations ();
HRESULT ImpersonateCaller();
HRESULT EndImpersonation ();
public:
DECLARE_NO_REGISTRY()
DECLARE_NOT_AGGREGATABLE(CSAFDataCollection)
DECLARE_GET_CONTROLLING_UNKNOWN()
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSAFDataCollection)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISAFDataCollection)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
END_COM_MAP()
CSAFDataCollection();
HRESULT FinalConstruct();
void FinalRelease ();
HRESULT ExecLoopCollect();
HRESULT ExecLoopCompare();
//
// Data collection "core" methods.
//
HRESULT FilterDataSpec ( /*[in]*/ WMIHistory::Database& wmihdQuery ,
/*[in]*/ WMIHistory::Database* wmihdFilter ,
/*[in]*/ WMIHistory::Database::ProvList& lstQueries );
HRESULT ExecDataSpec ( /*[in/out]*/ QueryResults& qr ,
/*[in/out]*/ WMIParser::ClusterByClassMap& cluster ,
/*[in]*/ WMIHistory::Database::ProvList& lstQueries ,
/*[in]*/ bool fImpersonate );
HRESULT CollectUsingTranslator ( /*[in] */ MPC::wstring& szNamespace ,
/*[in] */ MPC::wstring& szWQL ,
/*[out]*/ IXMLDOMDocument* *ppxddDoc );
HRESULT CollectUsingEncoder ( /*[in] */ MPC::wstring& szNamespace ,
/*[in] */ MPC::wstring& szWQL ,
/*[out]*/ IXMLDOMDocument* *ppxddDoc );
HRESULT Distribute ( /*[in] */ IXMLDOMDocument* pxddDoc ,
/*[in/out]*/ QueryResults& qr ,
/*[in/out]*/ WMIParser::ClusterByClassMap& cluster );
HRESULT ComputeDelta ( /*[in]*/ QueryResults& qr ,
/*[in]*/ WMIParser::ClusterByClassMap& cluster ,
/*[in]*/ WMIHistory::Database::ProvList& lstQueries ,
/*[in]*/ bool fPersist );
HRESULT CollateMachineData ( /*[in] */ QueryResults& qr ,
/*[in] */ WMIParser::ClusterByClassMap& cluster ,
/*[in] */ MPC::wstring* pszNamespace ,
/*[in] */ MPC::wstring* pszClass ,
/*[in] */ bool fGenerate ,
/*[out]*/ IXMLDOMDocument* *ppxddDoc );
HRESULT CollateMachineDataWithTimestamp( /*[in] */ QueryResults& qr ,
/*[in] */ WMIParser::ClusterByClassMap& cluster ,
/*[in] */ MPC::wstring* pszNamespace ,
/*[in] */ MPC::wstring* pszClass ,
/*[out]*/ IXMLDOMDocument* *ppxddDoc );
HRESULT CollateHistory ( /*[in] */ WMIHistory::Database& wmihdQuery ,
/*[in] */ WMIHistory::Database& wmphdFilter ,
/*[out]*/ IXMLDOMDocument* *ppxddDoc );
//
// Event firing methods.
//
HRESULT Fire_onStatusChange( ISAFDataCollection* hcpdc, tagDC_STATUS dsStatus );
HRESULT Fire_onProgress ( ISAFDataCollection* hcpdc, LONG lDone, LONG lTotal );
HRESULT Fire_onComplete ( ISAFDataCollection* hcpdc, HRESULT hrRes );
//
// Utility methods.
//
HRESULT CanModifyProperties();
HRESULT IsCollectionAborted();
public:
HRESULT put_Status ( /*[in]*/ DC_STATUS newVal ); // INTERNAL METHOD.
HRESULT try_Status ( /*[in]*/ DC_STATUS preVal, /*[in]*/ DC_STATUS postVal ); // INTERNAL METHOD.
HRESULT put_ErrorCode( /*[in]*/ DWORD newVal ); // INTERNAL METHOD.
// ISAFDataCollection
STDMETHOD(get_Status )( /*[out]*/ DC_STATUS *pVal );
STDMETHOD(get_PercentDone )( /*[out]*/ long *pVal );
STDMETHOD(get_ErrorCode )( /*[out]*/ long *pVal );
STDMETHOD(get_MachineData_DataSpec )( /*[out]*/ BSTR *pVal );
STDMETHOD(put_MachineData_DataSpec )( /*[in] */ BSTR pVal );
STDMETHOD(get_History_DataSpec )( /*[out]*/ BSTR *pVal );
STDMETHOD(put_History_DataSpec )( /*[in] */ BSTR pVal );
STDMETHOD(get_History_MaxDeltas )( /*[out]*/ long *pVal );
STDMETHOD(put_History_MaxDeltas )( /*[in] */ long pVal );
STDMETHOD(get_History_MaxSupportedDeltas)( /*[out]*/ long *pVal );
STDMETHOD(put_onStatusChange )( /*[in] */ IDispatch* function );
STDMETHOD(put_onProgress )( /*[in] */ IDispatch* function );
STDMETHOD(put_onComplete )( /*[in] */ IDispatch* function );
STDMETHOD(get_Reports )( /*[out]*/ IPCHCollection* *ppC );
STDMETHOD(ExecuteSync )();
STDMETHOD(ExecuteAsync)();
STDMETHOD(Abort )();
STDMETHOD(MachineData_GetStream)( /*[in]*/ IUnknown* *stream );
STDMETHOD(History_GetStream )( /*[in]*/ IUnknown* *stream );
STDMETHOD(CompareSnapshots)( /*[in]*/ BSTR bstrFilenameT0, /*[in]*/ BSTR bstrFilenameT1, /*[in]*/ BSTR bstrFilenameDiff );
//////////
HRESULT ExecScheduledCollection();
};
class ATL_NO_VTABLE CSAFDataCollectionEvents : // Hungarian: hcpdce
public CComObjectRootEx<MPC::CComSafeMultiThreadModel>,
public IDispatchImpl<DSAFDataCollectionEvents, &DIID_DSAFDataCollectionEvents, &LIBID_HelpServiceTypeLib>
{
ISAFDataCollection* m_hcpdc;
DWORD m_dwCookie;
HANDLE m_hEvent;
void UnregisterForEvents( );
HRESULT RegisterForEvents ( /*[in]*/ ISAFDataCollection* hcpdc );
public:
CSAFDataCollectionEvents();
HRESULT FinalConstruct();
void FinalRelease();
HRESULT WaitForCompletion( /*[in]*/ ISAFDataCollection* hcpdc );
BEGIN_COM_MAP(CSAFDataCollectionEvents)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(DSAFDataCollectionEvents)
END_COM_MAP()
public:
STDMETHOD(Invoke)( /*[in] */ DISPID dispIdMember,
/*[in] */ REFIID riid ,
/*[in] */ LCID lcid ,
/*[in] */ WORD wFlags ,
/*[in/out]*/ DISPPARAMS *pDispParams ,
/*[out] */ VARIANT *pVarResult ,
/*[out] */ EXCEPINFO *pExcepInfo ,
/*[out] */ UINT *puArgErr );
};
#endif // !defined(__INCLUDED___SAF___DATACOLLECTION_H___)