//***************************************************************************
//
//  TestInfo.h
//
//  Module: CDM Provider
//
//  Purpose: Defines the CClassPro class.  An object of this class is
//           created by the class factory for each connection.
//
//  Copyright (c) 2000 Microsoft Corporation
//
//***************************************************************************

class CWdmClass
{
    public:
        CWdmClass();
        ~CWdmClass();

        //
        // Linked list management routines for the benefit of the
        // provider
        //
        CWdmClass *GetNext();
        CWdmClass *GetPrev();
        void InsertSelf(CWdmClass **Head);

        
        BOOLEAN IsThisInitialized(void);

        HRESULT InitializeSelf(IWbemContext *pCtx,
                               PWCHAR CimClass);
        
        HRESULT RemapToCimClass(IWbemContext *pCtx);

        BOOLEAN ClaimCimClassName(PWCHAR CimClassName);
        
        HRESULT GetIndexByCimRelPath(BSTR CimObjectPath,
                                     int *RelPathIndex);

        BOOLEAN IsInstancesAvailable() {return(MappingInProgress == 0);};
        void IncrementMappingInProgress() { InterlockedIncrement(&MappingInProgress); };
        void DecrementMappingInProgress() { InterlockedDecrement(&MappingInProgress); };

		HRESULT PutInstance(IWbemContext *pCtx,
							int RelPathIndex,
							IWbemClassObject *pCimInstance);
        
        //
        // Accessors
        //
        ULONG GetInstanceCount(void) { return(RelPathCount); };
        BSTR /* NOFREE */ GetWdmRelPath(int RelPathIndex);
        BSTR /* NOFREE */ GetCimRelPath(int RelPathIndex);
        IWbemClassObject *GetCimInstance(int RelPathIndex);
    
        IWbemServices *GetWdmServices(void);
        IWbemServices *GetCimServices(void);
                
    private:                                  
        
        HRESULT WdmPropertyToCimProperty(
                                         IWbemClassObject *pCimClassInstance,
                                         IWbemClassObject *pWdmClassInstance,
                                         BSTR PropertyName,
                                         VARIANT *PropertyValue,
                                         CIMTYPE CimCimType,
                                         CIMTYPE WdmCimType
                                        );

        HRESULT CimPropertyToWdmProperty(
                                         IWbemClassObject *pWdmClassInstance,
                                         IWbemClassObject *pCimClassInstance,
                                         BSTR PropertyName,
                                         VARIANT *PropertyValue,
                                         CIMTYPE WdmCimType,
                                         CIMTYPE CimCimType
                                        );
                
        HRESULT CopyBetweenCimAndWdmClasses(
                            IWbemClassObject *pDestinationClass,
                            IWbemClassObject *pSourceClass,
                            BOOLEAN WdmToCdm
                            );
    

        HRESULT FillInCimInstance(
            IN IWbemContext *pCtx,
            IN int RelPathIndex,
            IN OUT IWbemClassObject *pCimInstance,
            IN IWbemClassObject *pWdmInstance
            );


        
        HRESULT GetWdmInstanceByIndex(IWbemContext *pCtx,
                                      int RelPathIndex,
                                      IWbemClassObject **Instance);
        

        HRESULT CreateCimInstance( IWbemContext  *pCtx,
                                int RelPathIndex,
                                IWbemClassObject **Instance);

        HRESULT DiscoverPropertyTypes(IWbemContext *pCtx,
                                      IWbemClassObject *pClassObject);

//
// Data Members
//

        LONG MappingInProgress;
        
        typedef enum
        {
            UnknownDerivation,
            NoDerivation,
            ConcreteDerivation,
            NonConcreteDerivation
        } DERIVATION_TYPE, *PDERIVATION_TYPE;
        
        DERIVATION_TYPE DerivationType;
        CBstrArray PropertyList;
                
        //
        // Link list management
        //
        CWdmClass *Next;
        CWdmClass *Prev;
        
        //
        // WDM/CIM Class Names
        //
        BSTR WdmShadowClassName;       // Shadow class name
        BSTR CimClassName;             // Current class name
        
        BSTR CimMappingClassName;
        BSTR CimMappingProperty;
        BSTR WdmMappingClassName;
        BSTR WdmMappingProperty;
        
        //
        // List of mappings between Cim and WDM.
        //
        int RelPathCount;
        CBstrArray *CimMapRelPaths;
        CBstrArray *WdmRelPaths;        
        CWbemObjectList *CimInstances;

		//
		// Useful device information
        CBstrArray *PnPDeviceIds;
		CBstrArray *FriendlyName;
		CBstrArray *DeviceDesc;
};