/*++

Copyright (C) 1998-1999 Microsoft Corporation

Module Name:

    classmap.h

Abstract:

    the perfobject ID is combination of the perf counter ID and 
    the perf counter type. This is necessary to support counter
    definitions that use the counter ID for the numerator and denominator
    values (e.g. a counter and it's base value.)

--*/

//***************************************************************************
//
//  class CClassMapInfo
//
//***************************************************************************

#ifndef _CLASSMAP_H_
#define _CLASSMAP_H_

#include "utils.h"

typedef __int64 PerfObjectId;

#define CM_MAKE_PerfObjectId(ctr,type)  (PerfObjectId)(((__int64)(ctr)) | (((__int64)type << 32) & 0xFFFFFFFF00000000))

class CClassMapInfo
{
private:
    // friend clss declarations
    friend class CNt5PerfProvider;
    friend class CNt5Refresher;
    friend class PerfHelper;
    friend class CPerfObjectAccess; 

    // cached class definition object from CIMOM
    IWbemClassObject    *m_pClassDef;
    
    LPWSTR m_pszClassName;      // name of this class
    BOOL   m_bSingleton;        // true if this class has 1 and only 1 instance
    BOOL   m_bCostly;           // true when the costly qualifier is present in the obj def
    DWORD  m_dwObjectId;        // perf object ID corresponding to this class

    LONG   m_lRefCount;         // count of objects that are using this instance

    // saved handles to properties that are in every class of a 
    // performance class object
    LONG   m_dwNameHandle;
    LONG   m_dwPerfTimeStampHandle;
    LONG   m_dw100NsTimeStampHandle;
    LONG   m_dwObjectTimeStampHandle;
    LONG   m_dwPerfFrequencyHandle;
    LONG   m_dw100NsFrequencyHandle;
    LONG   m_dwObjectFrequencyHandle;

    // These entries make up the table of saved handles to the properties
    // belonging to this class.
    DWORD  m_dwNumProps;        // number of properties in the class
    PerfObjectId *m_pdwIDs;     // array of PerfCounterTitleIndex values 
    DWORD *m_pdwHandles;        // array of handles to each of the properties
    DWORD *m_pdwTypes;          // array of perf counter type values

    // internal sort function to arrange handles in order of the
    // perf counter ID so as to facilitate a binary table search 
    //
    // NOTE: Consider a better search routine base on table size
    void SortHandles();
            
public:
    CClassMapInfo();
   ~CClassMapInfo();
   
    // loads a new object and caches the necessary information
    BOOL Map( IWbemClassObject *pObj );
    // creates a new copy from an existing Class Map
    CClassMapInfo *CreateDuplicate();

    LONG    AddRef() {return ++m_lRefCount;}   // increment reference counter
    LONG    Release() {return --m_lRefCount;}   // decrement reference counter

    // looks up the ID in the table and returns the corresponding
    // handle to the property
    LONG GetPropHandle(PerfObjectId dwId);
    
    // returns information about the class
    DWORD GetObjectId() { return m_dwObjectId; }
    BOOL IsSingleton() { return m_bSingleton; }
    BOOL IsCostly() { return m_bCostly; }
};

#endif  // _CLASSMAP_H_