//+------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1996 - 1997
//
//  File:    cclsacc.hxx
//
//  Contents:    Definitions for Class factory and IUnknown methods 
//              for CClassAccess
//
//  Author:    DebiM
//
//-------------------------------------------------------------------------


class CClassAccess :  
        public IClassAccess
{
public:

  CClassAccess(void);
  ~CClassAccess(void);
  
  // IUnknown
  HRESULT __stdcall QueryInterface(
            REFIID  iid,
            void ** ppv );
  ULONG __stdcall AddRef();
  ULONG __stdcall Release();
    
  // IClassInfo

  HRESULT  __stdcall GetAppInfo(
          uCLSSPEC      *   pClassSpec,        // Class Spec (CLSID/Ext/MIME)
          QUERYCONTEXT  *   pQryContext,       // Query Attributes
          INSTALLINFO   *   pInstallInfo
          );

  HRESULT  __stdcall EnumPackages (
        LPOLESTR        pszPackageName, 
        GUID            *pCategory,
        ULONGLONG       *pLastUsn,
        DWORD           dwAppFlags,      // AppType options
        IEnumPackage    **ppIEnumPackage
        );

//
// IClassRefresh
//
/*    HRESULT  __stdcall GetUpgrades (
        ULONG               cClasses,
        CLSID               *pClassList,     // CLSIDs Installed
        CSPLATFORM          Platform,
        LCID                dwLocale,
        PACKAGEINFOLIST     *pPackageInfoList);

    HRESULT  __stdcall CommitUpgrades ();

*/
  //---------------------------------------------------------------------
protected:
     unsigned long m_uRefs;
     unsigned long m_cCalls;
};


        

class CClassAccessCF : public IClassFactory
{
public:
  CClassAccessCF();
  ~CClassAccessCF();
  
  virtual  HRESULT  __stdcall  QueryInterface(REFIID riid, void  * * ppvObject);
  
  virtual  ULONG __stdcall  AddRef();
  
  virtual  ULONG __stdcall  Release();
  
  virtual  HRESULT  __stdcall  CreateInstance(IUnknown * pUnkOuter, REFIID riid, void  * * ppvObject);
  
  virtual  HRESULT  __stdcall  LockServer(BOOL fLock);

protected:
  unsigned long m_uRefs;
};

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

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


    CMergedEnumPackage();
    ~CMergedEnumPackage();

    HRESULT Initialize(IEnumPackage **pcsEnum, ULONG cEnum);

private:
    IEnumPackage **m_pcsEnum;
    ULONG                m_cEnum;    
    ULONG                m_dwRefCount;
    ULONG                m_csnum;
};



