////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Microsoft WMI OLE DB Provider
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
//
// Utility object versions for synthesized rowsets.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef __SCHEMA_INCL__
#define __SCHEMA_INCL__

#include "headers.h"

#define SOURCES_ROWSET              10
#define PROVIDER_TYPES_ROWSET       20
#define CATALOGS_ROWSET             30
#define COLUMNS_ROWSET              40
#define TABLES_ROWSET               60
#define PRIMARY_KEYS_ROWSET         70
#define TABLES_INFO_ROWSET          80
#define PROCEDURES_ROWSET           90
#define PROCEDURE_PARAMETERS_ROWSET 100


/////////////////////////////////////////////////////////////////////////////////////////////
//  The Schema rowset definitions
/////////////////////////////////////////////////////////////////////////////////////////////
// FOR THE PROVIDER_TYPES ROWSET
typedef struct _CIMTypeInfo
{
    WCHAR *         wcsTypeName;
    short           DataType;
    unsigned long   ColumnSize;
//    WCHAR *     LiteralPrefix;        Same values for all rows, so hardcoded in function
//    WCHAR *     LiteralSuffix;        Same values for all rows, so hardcoded in function
//    WCHAR *     CreateParams;         Same values for all rows, so hardcoded in function
//    CIM_BOOLEAN IsNullable;           Same values for all rows, so hardcoded in function
//    CIM_BOOLEAN CaseSensitive;        Same values for all rows, so hardcoded in function
//    CIM_UINT32  Searchable;           Same values for all rows, so hardcoded in function
    BOOL            UnsignedAttribute;
//    CIM_BOOLEAN FixedPrec;            Same values for all rows, so hardcoded in function
//    CIM_BOOLEAN AutoUnique;           Same values for all rows, so hardcoded in function
//    WCHAR *     LocalTypeName;        Same values for all rows, so hardcoded in function
//    CIM_SINT16  MinimumScale;         Same values for all rows, so hardcoded in function
//    CIM_SINT16  MaximumScale;         Same values for all rows, so hardcoded in function
//  DBTYPE_GUID Guid;
//    WCHAR *     TypeLib;              Same values for all rows, so hardcoded in function
//    WCHAR *     Version;              Same values for all rows, so hardcoded in function
//    CIM_BOOLEAN IsLong;               Same values for all rows, so hardcoded in function
//    CIM_BOOLEAN BestMatch;            Same values for all rows, so hardcoded in function
//  CIM_BOOLEAN IsFixedLength;          Same values for all rows, so hardcoded in function

}CIMTypeInfo;


typedef struct _SchemaRowsetDefinition
{
    LPWSTR wcsColumnName;
    CIMTYPE Type;

} SchemaRowsetDefinition;

////////////////////////////////////////////////////////////////////////////////////////////////////////
// SCHEMA BASE CLASS
//
// This class is used by one of the many CSchema__xxx classes to retrieve schema information.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema : public CRowset
{
	int m_nTableId;

	HRESULT GetTableName(WCHAR *pTableName);

    public:		

		
        STDMETHODIMP	FInit(  ULONG			cPropertySets,		// IN  Count of properties			
		                        DBPROPSET		rgProperties[],		// IN  Properties array
		                        REFIID			riid,				// IN  riid for IRowset object
		                        IUnknown		*pUnkOuter,			// IN  Outer unknown
		                        IUnknown		**ppIRowset,		// OUT Newly-created IRowset interface		
                                WCHAR * wcsSpecificTable
	    );

    protected:	
        //=========================================================================
    	// These are functions a derived class needs to call (only on base).
        // Protected so only a derived class can use.
        //=========================================================================
	    CSchema	(LPUNKNOWN pUnkOuter, int nTableId,PCDBSESSION pObj );	

        //=========================================================================
	    // Sets the rowset property corresponding to the requested interface
    	// if the requested interface is available on a read-only rowset.
        //=========================================================================
    	HRESULT SetReadOnlyProperty(	CUtilProp*	pRowsetProps, 	REFIID riid);

    protected:	
	    
	    virtual ~CSchema();                                         //Clients must use Release().

};
////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for CATALOGS rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////

class CSchema_Catalogs: public CSchema
{
    public:	
        CSchema_Catalogs(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,CATALOGS_ROWSET,pObj) {};	

};

////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for PROVIDER_TYPES rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema_Provider_Types: public CSchema
{
    public:	
        CSchema_Provider_Types(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,PROVIDER_TYPES_ROWSET,pObj) {};	

};

////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for COLUMNS rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema_Columns: public CSchema
{
    public:	
        CSchema_Columns(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,COLUMNS_ROWSET,pObj) {};	

};


////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for TABLES rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema_Tables: public CSchema
{
    public:	
        CSchema_Tables(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,TABLES_ROWSET,pObj) {};	

};

////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for primary keys rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema_Primary_Keys: public CSchema
{
    public:	
        CSchema_Primary_Keys(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,PRIMARY_KEYS_ROWSET,pObj) {};	

};

////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for TABLES_INFO rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema_Tables_Info: public CSchema
{
    public:	
        CSchema_Tables_Info(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,TABLES_INFO_ROWSET,pObj) {};	

};
////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema Command object for Sources rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////
class CSchema_ISourcesRowset: public CSchema
{
    public:	
       
        CSchema_ISourcesRowset(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,SOURCES_ROWSET,pObj) {}	

};
////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema object for Procedures rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////

class CSchema_Procedures: public CSchema
{
    public:	
        CSchema_Procedures(LPUNKNOWN pUnkOuter,PCDBSESSION pObj ):CSchema(pUnkOuter,PROCEDURES_ROWSET,pObj) {};	
};

////////////////////////////////////////////////////////////////////////////////////////////////
//
// Schema object for PROCEDURES_PARAMETERS rowset.
//
////////////////////////////////////////////////////////////////////////////////////////////////

class CSchema_Procedure_Parameters: public CSchema
{
    public:	
        CSchema_Procedure_Parameters(LPUNKNOWN pUnkOuter,PCDBSESSION pObj )
                                      :CSchema(pUnkOuter,PROCEDURE_PARAMETERS_ROWSET,pObj) {};	
};

////////////////////////////////////////////////////////////////////////////////////////////////
class CImpIDBSchemaRowset : public IDBSchemaRowset	//@base public | IDBSchemaRowset
{
    private: 
	
	enum eRestrictionSupport{
		eSup_CATALOGS				= 0x00,	// Allow nothing
		eSup_COLUMNS				= 0x07,	// Allow the first 3 columns as a restriction
		eSup_PRIMARY_KEYS			= 0x07,	// Allow the first 3 columns as a restriction
		eSup_PROCEDURE_PARAMETERS	= 0x03,	// Allow the first 2 columns as a restriction
		eSup_PROCEDURES				= 0x03,	// Allow the first 2 columns as a restriction
		eSup_PROVIDER_TYPES			= 0x00,	// Allow nothing
		eSup_TABLES					= 0x07,	// Allow the first 3 columns as a restriction
		eSup_TABLES_INFO			= 0x07,	// Allow the first 3 columns as a restriction
		eSup_LINKEDSERVERS			= 0x01, // 1 out of 1
		};

public: 
	CImpIDBSchemaRowset(PCDBSESSION pCDBSession){
		DEBUGCODE(m_cRef = 0L);
		m_pCDBSession = pCDBSession;
    }
	~CImpIDBSchemaRowset() {assert(m_cRef == 0);}

	STDMETHODIMP_(ULONG) AddRef(void)
	{																
		DEBUGCODE(InterlockedIncrement((long*)&m_cRef));						
		return m_pCDBSession->GetOuterUnknown()->AddRef();								
	}								
	
	STDMETHODIMP_(ULONG) Release(void)
	{
		DEBUGCODE(long lRef = InterlockedDecrement((long*)&m_cRef);
	   if( lRef < 0 ){
		   ASSERT("Reference count on Object went below 0!")
	   })
	
		return m_pCDBSession->GetOuterUnknown()->Release();								
	}

	STDMETHODIMP QueryInterface(REFIID riid, LPVOID *ppv)
	{																	
		return m_pCDBSession->GetOuterUnknown()->QueryInterface(riid, ppv);					
	}

	STDMETHODIMP GetRowset( IUnknown *pUnkOuter,  REFGUID rguidSchema,  ULONG cRestrictions, const VARIANT rgRestrictions[],
                            REFIID riid, ULONG cProperties,	DBPROPSET rgProperties[], IUnknown **ppRowset);
    STDMETHODIMP GetSchemas( ULONG *pcSchemas, GUID **ppSchemas, ULONG **prgRestrictionSupport );

private:
	DEBUGCODE(ULONG m_cRef);
	PCDBSESSION		m_pCDBSession;
};

typedef CImpIDBSchemaRowset *PIMPIDBSCHEMAROWSET;


//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaClassInstanceWrapper : public CWbemClassInstanceWrapper
{
   protected:
        ULONG m_uCurrentIndex;
        int m_nMaxColumns;


    public:
        CWbemSchemaClassInstanceWrapper(CWbemClassParameters * p);
        ~CWbemSchemaClassInstanceWrapper();

        void SetIndex(ULONG u)                          { m_uCurrentIndex = u;}
        void AddToKeyList(WCHAR *& pwcsKeyList, WCHAR * wcsKey );

        virtual HRESULT ResetInstanceFromKey(CBSTR Key) { return CWbemClassInstanceWrapper::ResetInstanceFromKey(Key); }
        
        virtual HRESULT GetKey(CBSTR & Key)             { return CWbemClassInstanceWrapper::GetKey(Key);}
		virtual HRESULT RefreshInstance()               { return CWbemClassInstanceWrapper::RefreshInstance(); }
		virtual WCHAR * GetClassName()                  { return CWbemClassInstanceWrapper::GetClassName(); }

        HRESULT GetClassProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
        virtual HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor )=0;
 
};
//////////////////////////////////////////////////////////////////////////////////////////////
// Works with just the schema classes
//////////////////////////////////////////////////////////////////////////////////////////////
class  CWbemSchemaClassDefinitionWrapper : public CWbemClassDefinitionWrapper
{
    protected:
        int                         m_nSchemaClassIndex;
        int                         m_nMaxColumns;

    public:
        CWbemSchemaClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaClassDefinitionWrapper();

        HRESULT ValidClass();

        HRESULT TotalPropertiesInClass(ULONG & ulPropCount, ULONG &ulSysPropCount);
        HRESULT BeginPropertyEnumeration();
        HRESULT EndPropertyEnumeration();
        virtual HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue, CIMTYPE * pType ,LONG * plFlavor ) { return CWbemClassDefinitionWrapper::GetNextProperty(pProperty,vValue,pType,plFlavor);}
        HRESULT BeginPropertyQualifierEnumeration(BSTR strPropName);

};
///////////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaInstanceList: public CWbemInstanceList 
{
    protected:
        ULONG m_ulMaxRow;
        WCHAR * m_pwcsSpecificClass;
        IWbemClassObject * m_pSpecificClass;
        BOOL m_fGotThemAll;
 
    public:
        CWbemSchemaInstanceList(CWbemClassParameters * p);
        CWbemSchemaInstanceList(CWbemClassParameters * p,WCHAR * pSpecific);
        ~CWbemSchemaInstanceList();

        virtual HRESULT Reset()=0;
        virtual HRESULT NextInstance(CBSTR & Key, CWbemClassInstanceWrapper ** p) { return CWbemInstanceList::NextInstance(Key,p);}
        virtual HRESULT PrevInstance( CBSTR & Key, CWbemClassInstanceWrapper *& p){ if( !m_pwcsSpecificClass ){ return CWbemInstanceList::PrevInstance(Key,p);} return S_OK;}
        HRESULT ResetTheSpecificClass();
        HRESULT GetTheSpecificClass();


};
//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Sources schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////

class CWbemSchemaSourcesClassDefinitionWrapper: public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaSourcesClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaSourcesClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );

};
class CWbemSchemaSourcesInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:

    public:
        CWbemSchemaSourcesInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p)
        { }
        ~CWbemSchemaSourcesInstanceWrapper() {}
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
};

class CWbemSchemaSourcesInstanceList: public CWbemSchemaInstanceList
{
    private:

    public:
        CWbemSchemaSourcesInstanceList(CWbemClassParameters * p) : CWbemSchemaInstanceList(p) {m_nBaseType = SOURCES_ROWSET;}
        ~CWbemSchemaSourcesInstanceList() {}
        HRESULT Reset();
};

//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Provider Types schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaProviderTypesClassDefinitionWrapper: public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
       CWbemSchemaProviderTypesClassDefinitionWrapper(CWbemClassParameters * p);
       ~CWbemSchemaProviderTypesClassDefinitionWrapper() {}
       HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
       HRESULT ResetInstanceFromKey(CBSTR Key);
 };
class CWbemSchemaProviderTypesInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:

    public:
        CWbemSchemaProviderTypesInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p)
        { }
        ~CWbemSchemaProviderTypesInstanceWrapper() {}
         HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
         HRESULT GetKey(CBSTR & Key);
         HRESULT ResetInstanceFromKey(CBSTR Key);
         HRESULT RefreshInstance();
         WCHAR * GetClassName();
};
class CWbemSchemaProviderTypesInstanceList: public CWbemSchemaInstanceList
{
    private:

    public:
        CWbemSchemaProviderTypesInstanceList(CWbemClassParameters * p) : CWbemSchemaInstanceList(p) {m_nBaseType = PROVIDER_TYPES_ROWSET;}
        ~CWbemSchemaProviderTypesInstanceList(){}
        HRESULT Reset();
        HRESULT NextInstance(CBSTR & Key, CWbemClassInstanceWrapper ** p);

};

//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Catalogs schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaCatalogsClassDefinitionWrapper: public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaCatalogsClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaCatalogsClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaCatalogsInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:

    public:
        CWbemSchemaCatalogsInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p)
        { }
        ~CWbemSchemaCatalogsInstanceWrapper() {}
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaCatalogsInstanceList: public CWbemSchemaInstanceList
{
    private:

    public:
        CWbemSchemaCatalogsInstanceList(CWbemClassParameters * p) : CWbemSchemaInstanceList(p) { m_nBaseType = CATALOGS_ROWSET; }
        ~CWbemSchemaCatalogsInstanceList() {}
        HRESULT Reset();
};


//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the COlumns schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaColumnsClassDefinitionWrapper : public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaColumnsClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaColumnsClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};

class CWbemSchemaColumnsInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:
        cRowColumnInfoMemMgr * m_pColumns;

    public:
        CWbemSchemaColumnsInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p) { m_pColumns=NULL;}
        ~CWbemSchemaColumnsInstanceWrapper() {}

        void SetColumnsPtr(cRowColumnInfoMemMgr * p)    { m_pColumns = p; }
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
        HRESULT GetKey(CBSTR & Key);

};
class CWbemSchemaColumnsInstanceList: public CWbemSchemaInstanceList
{
    private:
        LONG  m_lColumnIndex;
        cRowColumnInfoMemMgr m_Columns;
        
        HRESULT GetColumnInformation(CWbemClassInstanceWrapper  * p);
        void  FreeColumns()                     { m_Columns.FreeColumnNameList(); m_Columns.FreeColumnInfoList();}

    public:
        CWbemSchemaColumnsInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemSchemaInstanceList(p, pSpecific) 
        {    m_lColumnIndex = -1; m_nBaseType = COLUMNS_ROWSET;}
        ~CWbemSchemaColumnsInstanceList() {FreeColumns();}
        DBCOUNTITEM GetTotalColumns()  { return m_Columns.GetTotalNumberOfColumns(); }
        HRESULT Reset();
        HRESULT NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst  );

};

//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Tables schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaTablesClassDefinitionWrapper: public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaTablesClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaTablesClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaTablesInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:

    public:
        CWbemSchemaTablesInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p)
        { }
        ~CWbemSchemaTablesInstanceWrapper() {}
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaTablesInstanceList: public CWbemSchemaInstanceList
{
    private:

    public:
        CWbemSchemaTablesInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemSchemaInstanceList(p, pSpecific) 
        {m_nBaseType = TABLES_ROWSET;}
        ~CWbemSchemaTablesInstanceList() {}
        HRESULT Reset();
        HRESULT NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst  );

};
//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Primary Keys schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaPrimaryKeysClassDefinitionWrapper : public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaPrimaryKeysClassDefinitionWrapper(CWbemClassParameters * p);
         ~CWbemSchemaPrimaryKeysClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaPrimaryKeysInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:

    public:
        CWbemSchemaPrimaryKeysInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p)
        { }
        ~CWbemSchemaPrimaryKeysInstanceWrapper() {}
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaPrimaryKeysInstanceList: public CWbemSchemaInstanceList
{
    private:

    public:

        CWbemSchemaPrimaryKeysInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemSchemaInstanceList(p, pSpecific) { m_nBaseType = PRIMARY_KEYS_ROWSET;}
        ~CWbemSchemaPrimaryKeysInstanceList() {}
        HRESULT Reset();
        HRESULT NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst  );

};


//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Tables Info schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaTablesInfoClassDefinitionWrapper: public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaTablesInfoClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaTablesInfoClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaTablesInfoInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    private:

    public:
        CWbemSchemaTablesInfoInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p) {}
        ~CWbemSchemaTablesInfoInstanceWrapper() {}
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
};
class CWbemSchemaTablesInfoInstanceList: public CWbemSchemaInstanceList
{
    private:

    public:
        CWbemSchemaTablesInfoInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemSchemaInstanceList(p,pSpecific) 
        {m_nBaseType = TABLES_INFO_ROWSET;}
        ~CWbemSchemaTablesInfoInstanceList() {}
        HRESULT Reset();
        HRESULT NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst  );
};

//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Procedures schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaProceduresClassDefinitionWrapper: public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaProceduresClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaProceduresClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};

class CWbemSchemaProceduresInstanceWrapper: public CWbemSchemaClassInstanceWrapper 
{
    protected:
        CBSTR m_bstrCurrentMethodName;
        IWbemClassObject * m_pInClass;
        IWbemClassObject * m_pOutClass;


    public:
        CWbemSchemaProceduresInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaClassInstanceWrapper(p)
        {
            m_pInClass = NULL;
            m_pOutClass = NULL;
        }
        ~CWbemSchemaProceduresInstanceWrapper() 
        {
            m_bstrCurrentMethodName.Clear();
            SAFE_RELEASE_PTR(m_pInClass);
            SAFE_RELEASE_PTR(m_pOutClass);
        }
        HRESULT GetKey(CBSTR & Key);
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
        void SetMethodName(WCHAR * Method)         {  m_bstrCurrentMethodName.Clear(); m_bstrCurrentMethodName.SetStr(Method);}
        void SetInputClass(IWbemClassObject * p)   {  SAFE_RELEASE_PTR(m_pInClass);  m_pInClass = p;  if( p ) m_pInClass->AddRef(); }
        void SetOutputClass(IWbemClassObject * p)  {  SAFE_RELEASE_PTR(m_pOutClass); m_pOutClass = p; if( p ) m_pOutClass->AddRef(); }
};

class CWbemSchemaProceduresInstanceList: public CWbemSchemaInstanceList
{
    protected:
        CBSTR m_bstrCurrentMethodName;
        IWbemClassObject * m_pCurrentMethodClass;
        IWbemClassObject * m_pCurrentMethodInClass;
        IWbemClassObject * m_pCurrentMethodOutClass;
        BOOL m_fContinueWithSameClass;
        HRESULT GetSpecificNextInstance();

    public:
        CWbemSchemaProceduresInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemSchemaInstanceList(p, pSpecific) 
        {
            m_nBaseType = PROCEDURES_ROWSET; 
            m_fContinueWithSameClass = FALSE;
            m_pCurrentMethodClass = NULL;
            m_pCurrentMethodInClass = NULL;
            m_pCurrentMethodOutClass = NULL;
         }
        ~CWbemSchemaProceduresInstanceList() 
        {
            SAFE_RELEASE_PTR(m_pCurrentMethodClass);
            SAFE_RELEASE_PTR(m_pCurrentMethodInClass);
            SAFE_RELEASE_PTR(m_pCurrentMethodOutClass);
            ResetMethodPtrs();
        }
        HRESULT GetTheNextClassThatHasMethods();
        HRESULT Reset();
        HRESULT NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst  );
        void ResetMethodPtrs();
};

//////////////////////////////////////////////////////////////////////////////////////////////
//********************************************************************************************
//
//  Classes for the Procedure Parameters schema rowset
//
//********************************************************************************************
//////////////////////////////////////////////////////////////////////////////////////////////
class CWbemSchemaProceduresParametersClassDefinitionWrapper : public CWbemSchemaClassDefinitionWrapper 
{
    private:

    public:
        CWbemSchemaProceduresParametersClassDefinitionWrapper(CWbemClassParameters * p);
        ~CWbemSchemaProceduresParametersClassDefinitionWrapper() {}
        HRESULT GetNextProperty(BSTR * pProperty, VARIANT * vValue,CIMTYPE * pType , LONG * plFlavor );
};

class CWbemSchemaProceduresParametersInstanceWrapper: public CWbemSchemaProceduresInstanceWrapper 
{
    protected:
        CVARIANT  m_vProperty;
        short     m_nOrdinal;
        CBSTR     m_bstrPropertyName;

    public:
        CWbemSchemaProceduresParametersInstanceWrapper(CWbemClassParameters * p) : CWbemSchemaProceduresInstanceWrapper(p)
        { 
            m_nOrdinal = 0;
        }
        ~CWbemSchemaProceduresParametersInstanceWrapper() 
        {
            m_bstrPropertyName.Clear();
        }
        HRESULT GetSchemaProperty(WCHAR * wcsProperty, VARIANT * v, CIMTYPE * pType , LONG * plFlavor );
        HRESULT GetPropertyQualifier(WCHAR * wcsQualifier,VARIANT * v);
        
        void SetPropertyName(WCHAR * Name)   {  m_bstrPropertyName.Clear();  m_bstrPropertyName.SetStr(Name);}
        void SetProperty(CVARIANT v)         {  m_vProperty = v;}
        void SetOrdinal(short n)             {  m_nOrdinal = n; }
        HRESULT GetKey(CBSTR & Key);
};

class CWbemSchemaProceduresParametersInstanceList : public CWbemSchemaProceduresInstanceList
{
    private:
        BOOL m_fStillWorkingOnTheSameClass;
        short m_nOrdinal;
        CBSTR m_bstrPropertyName;
        CVARIANT m_vProperty;

    public:
        CWbemSchemaProceduresParametersInstanceList(CWbemClassParameters * p,WCHAR * pSpecific) : CWbemSchemaProceduresInstanceList(p, pSpecific) 
        {  
            m_nBaseType = PROCEDURE_PARAMETERS_ROWSET;
            m_fStillWorkingOnTheSameClass = FALSE;
            m_nOrdinal = 0;
        }

        ~CWbemSchemaProceduresParametersInstanceList() 
        {
            m_bstrPropertyName.Clear();
        }
        HRESULT NextInstance( CBSTR & Key, CWbemClassInstanceWrapper ** pInst  );
        HRESULT GetTheNextParameter();
        HRESULT GetTheNextClassThatHasParameters();

};


#endif	// __SCHEMA_INCL__