|
|
/*++
Copyright (C) 1996-2001 Microsoft Corporation
Module Name:
ASSOCQE.H
Abstract:
WinMgmt Association Query Engine
History:
raymcc 04-Jul-99 Created
--*/
#ifndef _ASSOCQE_H_
#define _ASSOCQE_H_
class CAssocQE_Sink; class CAssocQuery; class CObjectSink;
typedef HRESULT (CAssocQuery::*PF_FilterForwarder)(IWbemClassObject *);
#define ROLETEST_MODE_PATH_VALUE 1
#define ROLETEST_MODE_CIMREF_TYPE 2
#define ASSOCQ_FLAG_QUERY_ENDPOINT 1
#define ASSOCQ_FLAG_OTHER_ENDPOINT 2
class CAssocQuery : public IUnknown { friend class CAssocQE_Sink;
LONG m_lRef; // COM ref count
CAssocQueryParser m_Parser; // Parsed query access
CBasicObjectSink * m_pDestSink; // Final destination sink
IWbemClassObject *m_pEndpoint; // Endpoint in query
BSTR m_bstrEndpointClass; // Class name of endpoint
BSTR m_bstrEndpointPath; // Full path of endpoint
BSTR m_bstrEndpointRelPath; // Rel path of endpoint
bool m_bEndpointIsClass; // True if endpoint a class
CWStringArray m_aEndpointHierarchy; // Query endpoint class hiearchy
DWORD m_dwQueryStartTime; // When query started
DWORD m_dwLastResultTime; // Updated during indications
LONG m_lActiveSinks; // How many sinks are still running
HANDLE m_hSinkDoneEvent; // Signaled as sinks complete
CFlexArray m_aMaster; // Assoc class list
BOOL m_bLimitNeedsDecrement; // Helpers for 'associators of' queries.
// =====================================
CFlexArray m_aEpCandidates; // List of paths to EP candidates for associators queries
CCritSec m_csCandidateEpAccess; // Critsec to protect access to Ep candidate array
// Dynamic class cache.
// ====================
CFlexArray m_aDynClasses; // Contains all dynamic classes available as of this query
// Helpers for references of + CLASSDEFSONLY
// =========================================
CWStringArray m_aDeliveredClasses; // List of class names already in the below list
CCritSec m_csDeliveredAccess;
// From the original call.
// =======================
IWbemContext *m_pContext; CWbemNamespace *m_pNs; bool m_bCancel;
// Various Internal methods.
// =========================
CAssocQuery(); ~CAssocQuery();
// Class list manipulation.
// ========================
HRESULT BuildMasterAssocClassList( IN OUT CFlexArray &aResultSet );
HRESULT MergeInClassRefList( IN OUT CFlexArray &aResultSet );
HRESULT RemoveNonDynClasses( IN OUT CFlexArray &aMaster );
HRESULT ReduceToRealClasses( IN OUT CFlexArray & aResultSet );
// Endpoint analysis.
// ==================
HRESULT CanPropRefQueryEp( IN BOOL bStrict, IN LPWSTR pszPropName, IN IWbemClassObject *pObj, OUT BSTR *strRefType );
HRESULT CanClassRefQueryEp( IN BOOL bStrict, IN IWbemClassObject *pCls, OUT CWStringArray *paNames );
HRESULT CanClassRefReachQueryEp( IWbemQualifierSet *pQSet, BOOL bStrict );
HRESULT DoesAssocInstRefQueryEp( IN IWbemClassObject *pObj, OUT BSTR *pszRole );
HRESULT EpClassTest( LPCWSTR pszResultClass, LPCWSTR strClassName, IWbemClassObject *pTestClass );
HRESULT GetUnknownEpRoleAndPath( IN IWbemClassObject *pAssoc, IN BOOL *pFoundQueryEp, OUT BSTR *pszRole, OUT BSTR *pszUnkEpPath );
// Flow-of-control methods.
// ========================
void BranchToQueryType();
// Schema-query flow-of-control.
// =============================
void ExecSchemaQuery();
HRESULT SchemaQ_RefsQuery( IN OUT CFlexArray &aResultSet );
HRESULT SchemaQ_AssocsQuery( IN CFlexArray &aAssocSet );
HRESULT SchemaQ_Terminate( IN CFlexArray &aResultSet );
HRESULT SchemaQ_RefsFilter( IN OUT CFlexArray &aSrc );
HRESULT SchemaQ_AssocsFilter( IN OUT CFlexArray &aSrc );
HRESULT SchemaQ_GetAndFilterOtherEndpoints( IN CFlexArray &aAssocs, OUT CFlexArray &aEndpoints );
HRESULT SchemaQ_GetOtherEpClassName( IN IWbemClassObject *pAssoc, OUT BSTR *strOtherEpName );
// Normal (instances, classrefs queries)
// =====================================
HRESULT ExecNormalQuery();
HRESULT NormalQ_PreQueryClassFilter( CFlexArray &aMaster );
HRESULT NormalQ_ReferencesOf(); HRESULT NormalQ_AssociatorsOf();
HRESULT NormalQ_GetRefsOfEndpoint( IN IWbemClassObject *pClass, IN IWbemObjectSink *pSink );
HRESULT ConvertEpListToClassDefsOnly();
HRESULT NormalQ_LoadCheck();
HRESULT PerformFinalEpTests( IWbemClassObject *pEp );
HRESULT NormalQ_ConstructRefsQuery( IN IWbemClassObject *pClass, IN OUT IWbemContext *pContextCopy, OUT BSTR *strQuery );
HRESULT GetCimTypeForRef( IN IWbemClassObject *pCandidate, IN BSTR pszRole, OUT BSTR *strCimType );
HRESULT AssocClassHasOnlyKeys( IN IWbemClassObject *pObj );
HRESULT Normal_ExecRefs( IN CFlexArray &aMasterClassList );
// Filter auxiliaries for various query types.
// ===========================================
HRESULT FilterForwarder_NormalRefs( IN IWbemClassObject *pCandidate );
HRESULT FilterForwarder_NormalAssocs( IN IWbemClassObject *pAssocInst );
HRESULT NormalQ_AssocInstTest( IN IWbemClassObject *pAssoc, OUT LPWSTR *pszOtherEp );
HRESULT CanAssocClassRefUnkEp( IN IWbemClassObject *pClass, IN CWStringArray &aUnkEpHierarchy );
// DB Access abstraction for Quasar ease of porting.
// =================================================
HRESULT Db_GetClass( IN LPCWSTR pszName, OUT IWbemClassObject **pObj );
HRESULT Db_GetRefClasses( IN LPCWSTR pszClass, OUT CWStringArray &aRefClasses );
HRESULT Db_GetInstRefs( IN LPCWSTR pszTarget, IN IWbemObjectSink *pDest );
HRESULT Db_GetClassRefClasses( IN CFlexArray &aDest );
HRESULT GetClassDynasty( IN LPCWSTR pszClass, OUT CFlexArray &aDynasty );
// Various static auxiliaries for tests.
// ======================================
static HRESULT St_HasClassRefs( IN IWbemClassObject *pCandidate );
HRESULT AccessCheck(IWbemClassObject* pObj);
static HRESULT St_GetObjectInfo( IN IWbemClassObject *pObj, OUT BSTR *pClass, OUT BSTR *pRelpath, OUT BSTR *pPath, OUT CWStringArray &aHierarchy );
static HRESULT St_ObjPathInfo( IN LPCWSTR pszPath, OUT BSTR *pszClass, OUT BOOL *pbIsClass );
static HRESULT St_ReleaseArray( IN CFlexArray &aObjects );
static HRESULT St_ObjHasQualifier( IN LPCWSTR pszQualName, IN IWbemClassObject *pObj );
static HRESULT St_ObjIsOfClass( IN LPCWSTR pszRequiredClass, IN IWbemClassObject *pObj );
HRESULT GetClassDefsOnlyClass( IN IWbemClassObject *pExample, OUT IWbemClassObject **pClass );
HRESULT FindParentmostClass( IN IWbemClassObject *pAssocInst, OUT IWbemClassObject **pClassDef );
HRESULT TagProp( IN IWbemClassObject *pObjToTag, IN LPCWSTR pszPropName, IN LPCWSTR pszInOutTag );
// Other.
// ======
void UpdateTime() { m_dwLastResultTime = GetCurrentTime(); } void SignalSinkDone() { SetEvent(m_hSinkDoneEvent);}
HRESULT GetDynClasses();
HRESULT GetDynClass( IN LPCWSTR pszClassName, OUT IWbemClassObject **pCls ); void SortDynClasses();
HRESULT ResolveEpPathsToObjects(int nMaxToProcess);
HRESULT ComputeInOutTags( IN IWbemClassObject *pAssocInst, IN IWbemClassObject *pClass );
static HRESULT PathPointsToObj( IN LPCWSTR pszPath, IN IWbemClassObject *pObj, IN CWbemNamespace *pNs );
HRESULT GetClassFromAnywhere( IN LPCWSTR pszEpClassName, IN LPCWSTR pszFullClassPath, OUT IWbemClassObject **pCls );
HRESULT AddEpCandidatePath( IN BSTR strOtherEp );
void EmptyCandidateEpArray();
CObjectSink * CreateSink(PF_FilterForwarder pfnFilter, BSTR strTrackingQuery);
public: static CAssocQuery *CreateInst();
// IUnknown.
// =========
ULONG STDMETHODCALLTYPE AddRef(); ULONG STDMETHODCALLTYPE Release(); STDMETHODIMP QueryInterface(REFIID riid, void** ppv);
HRESULT Execute( IN CWbemNamespace *pNs, IN LPWSTR wszQuery, IN IWbemContext* pContext, IN CBasicObjectSink* pSink );
HRESULT Cancel();
static HRESULT RoleTest( IN IWbemClassObject *pEndpoint, IN IWbemClassObject *pCandidate, IN CWbemNamespace *pNs, IN LPCWSTR pszRole, IN DWORD dwMode ); };
#endif
|