#ifndef _CSMCATMANAGERENUMS_INCLUDE
#define _CSMCATMANAGERENUMS_INCLUDE

class CSCEnumCategories : public IEnumCATEGORYINFO
{
public:
    // IUnknown methods
    HRESULT  _stdcall QueryInterface(REFIID riid, void** ppObject);
    ULONG    _stdcall AddRef();
    ULONG    _stdcall Release();

    // IEnumCATEGORYINFO methods
    HRESULT __stdcall Next(ULONG celt, CATEGORYINFO *rgelt, ULONG *pceltFetched);
    HRESULT __stdcall Skip(ULONG celt);
    HRESULT __stdcall Reset(void);
    HRESULT __stdcall Clone(IEnumCATEGORYINFO **ppenum);


    CSCEnumCategories();
    HRESULT Initialize(IADsContainer *ADsCategoryContainer, LCID lcid);
    ~CSCEnumCategories();
private:
    LCID                m_lcid;
    IEnumVARIANT       *m_pEnumVariant;
    IADsContainer      *m_ADsCategoryContainer;
    ULONG               m_dwRefCount;
    DWORD		m_dwPosition;
};

class CSCEnumCategoriesOfClass : public IEnumCATID
{
public:
    // IUnknown methods
    HRESULT  _stdcall QueryInterface(REFIID riid, void** ppObject);
    ULONG    _stdcall AddRef();
    ULONG    _stdcall Release();

    // IEnumGUID methods
    HRESULT __stdcall Next(ULONG celt, GUID *rgelt, ULONG *pceltFetched);
    HRESULT __stdcall Skip(ULONG celt);
    HRESULT __stdcall Reset(void);
    HRESULT __stdcall Clone(IEnumGUID **ppenum);


    CSCEnumCategoriesOfClass();
    HRESULT Initialize(CATID catid[], ULONG cCatid);
    ~CSCEnumCategoriesOfClass();

private:
    ULONG               m_dwPosition;
    ULONG               m_cCatid;
    CATID              *m_catid;
    ULONG               m_dwRefCount;
};

class CSCEnumClassesOfCategories : public IEnumCLSID
{
public:
    // IUnknown methods
    HRESULT  _stdcall QueryInterface(REFIID riid, void** ppObject);
    ULONG    _stdcall AddRef();
    ULONG    _stdcall Release();

    // IEnumGUID methods
    HRESULT __stdcall Next(ULONG celt, GUID *rgelt, ULONG *pceltFetched);
    HRESULT __stdcall Skip(ULONG celt);
    HRESULT __stdcall Reset(void);
    HRESULT __stdcall Clone(IEnumGUID **ppenum);

    CSCEnumClassesOfCategories();
    HRESULT Initialize(ULONG cRequired, CATID rgcatidReq[],
                       ULONG cImplemented, CATID rgcatidImpl[],
                       IADsContainer   *ADsClassContainer,
                       ICatInformation *pICatInfo);

    ~CSCEnumClassesOfCategories();

private:
    ULONG		m_dwPosition;
    ULONG               m_dwRefCount, m_cRequired, m_cImplemented;
    CATID              *m_rgcatidReq, *m_rgcatidImpl;
    ICatInformation    *m_pICatInfo;
    IEnumVARIANT       *m_pEnumVariant;
    IADsContainer      *m_ADsClassContainer;
};

// extern ULONG g_dwRefCount;

CLSID ExtractClsid(Data *pData);

HRESULT GetCategoryProperty (IADs *pADs,
                          CATEGORYINFO  *pcatinfo,
                          LCID lcid);

HRESULT ImplSatisfied(CLSID clsid, ULONG cImplemented, CATID *ImplementedList,
               ICatInformation *pICatInfo);

HRESULT ReqSatisfied(CLSID clsid, ULONG cAvailReq, CATID *AvailReq,
               ICatInformation *pICatInfo);

#endif