/*++

Copyright (C) 1997-1999 Microsoft Corporation

Module Name:

    ntperf.h

Abstract:

    NT5 Perf counter provider

    <abstract>

--*/

#ifndef _NTPERF_H_
#define _NTPERF_H_

#include "flexarry.h"
#include "classmap.h"
#include "perfacc.h"

const DWORD cdwClassMapTimeout = 10000;

//***************************************************************************
//
//  class CNt5PerfProvider
//
//***************************************************************************

class CNt5PerfProvider : public IWbemHiPerfProvider, public IWbemProviderInit
{
    friend class CNt5Refresher;

public:
    typedef enum {
        CLSID_SERVER,
        CLSID_CLIENT
    } enumCLSID;

private:
    LONG                m_lRef;
    enumCLSID           m_OriginClsid;
    CFlexArray          m_aCache;       // Array of CClassMapInfo pointers
	CPerfObjectAccess	m_PerfObject;	// class to interface

    HANDLE				m_hClassMapMutex;	// Lock the provider's Class Map Cache

protected:
    BOOL AddClassMap(CClassMapInfo *pCls);
    CClassMapInfo *FindClassMap(LPWSTR pszClassName);

    BOOL MapClass(
        IWbemServices *pNs,
        WCHAR *wszClass,
        IWbemContext *pCtx    
        );

public:
    static BOOL HasPermission (void);
    static HRESULT CheckImpersonationLevel (void);
    
    CNt5PerfProvider(enumCLSID OriginClsid);
   ~CNt5PerfProvider();

    // Interface members.
    // ==================

    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();
    STDMETHODIMP QueryInterface(REFIID riid, void** ppv);

	// helper functions
	HRESULT CNt5PerfProvider::CreateRefresherObject( 
		/* [in] */ IWbemServices __RPC_FAR *pNamespace,
		/* [in] */ IWbemObjectAccess __RPC_FAR *pTemplate,
		/* [in] */ IWbemRefresher __RPC_FAR *pRefresher,
		/* [in] */ long lFlags,
		/* [in] */ IWbemContext __RPC_FAR *pContext,
		/* [string][in] */ LPCWSTR wszClass,
		/* [in] */ IWbemHiPerfEnum __RPC_FAR *pHiPerfEnum,
		/* [out] */ IWbemObjectAccess __RPC_FAR *__RPC_FAR *ppRefreshable,
		/* [out] */ long __RPC_FAR *plId
		);


    // IWbemHiPerfProvider methods.
    // ============================
        
    virtual HRESULT STDMETHODCALLTYPE QueryInstances( 
        /* [in] */ IWbemServices __RPC_FAR *pNamespace,
        /* [string][in] */ WCHAR __RPC_FAR *wszClass,
        /* [in] */ long lFlags,
        /* [in] */ IWbemContext __RPC_FAR *pCtx,
        /* [in] */ IWbemObjectSink __RPC_FAR *pSink
        );
    
    virtual HRESULT STDMETHODCALLTYPE CreateRefresher( 
        /* [in] */ IWbemServices __RPC_FAR *pNamespace,
        /* [in] */ long lFlags,
        /* [out] */ IWbemRefresher __RPC_FAR *__RPC_FAR *ppRefresher
        );
    
    virtual HRESULT STDMETHODCALLTYPE CreateRefreshableObject( 
        /* [in] */ IWbemServices __RPC_FAR *pNamespace,
        /* [in] */ IWbemObjectAccess __RPC_FAR *pTemplate,
        /* [in] */ IWbemRefresher __RPC_FAR *pRefresher,
        /* [in] */ long lFlags,
        /* [in] */ IWbemContext __RPC_FAR *pContext,
        /* [out] */ IWbemObjectAccess __RPC_FAR *__RPC_FAR *ppRefreshable,
        /* [out] */ long __RPC_FAR *plId
        );
    
    virtual HRESULT STDMETHODCALLTYPE StopRefreshing( 
        /* [in] */ IWbemRefresher __RPC_FAR *pRefresher,
        /* [in] */ long lId,
        /* [in] */ long lFlags
        );

    virtual HRESULT STDMETHODCALLTYPE CreateRefreshableEnum( 
        /* [in] */ IWbemServices __RPC_FAR *pNamespace,
        /* [string][in] */ LPCWSTR wszClass,
        /* [in] */ IWbemRefresher __RPC_FAR *pRefresher,
        /* [in] */ long lFlags,
        /* [in] */ IWbemContext __RPC_FAR *pContext,
        /* [in] */ IWbemHiPerfEnum __RPC_FAR *pHiPerfEnum,
        /* [out] */ long __RPC_FAR *plId);
    
    virtual HRESULT STDMETHODCALLTYPE GetObjects( 
        /* [in] */ IWbemServices __RPC_FAR *pNamespace,
        /* [in] */ long lNumObjects,
        /* [size_is][in] */ IWbemObjectAccess __RPC_FAR *__RPC_FAR *apObj,
        /* [in] */ long lFlags,
        /* [in] */ IWbemContext __RPC_FAR *pContext);
    

    // IWbemProviderInit method.
    // =========================
        
    virtual HRESULT STDMETHODCALLTYPE Initialize( 
        /* [unique][in] */ LPWSTR wszUser,
        /* [in] */ LONG lFlags,
        /* [in] */ LPWSTR wszNamespace,
        /* [unique][in] */ LPWSTR wszLocale,
        /* [in] */ IWbemServices __RPC_FAR *pNamespace,
        /* [in] */ IWbemContext __RPC_FAR *pCtx,
        /* [in] */ IWbemProviderInitSink __RPC_FAR *pInitSink
        );
        
};

// defined in server.cpp
extern void ObjectCreated();
extern void ObjectDestroyed();

#endif