//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File:        view.h
//
// Contents:    Cert Server Database interface implementation
//
//---------------------------------------------------------------------------


#include "resource.h"       // main symbols

// defines for multi-thread handling
typedef enum
{
    ENUMTHREAD_OPEN = 0,
    ENUMTHREAD_NEXT,
    ENUMTHREAD_CLEANUP,
    ENUMTHREAD_END
} ENUMTHREADCALLS;


class CEnumCERTDBRESULTROW: public IEnumCERTDBRESULTROW
{
public:
    CEnumCERTDBRESULTROW(BOOL fThreading = TRUE);
    ~CEnumCERTDBRESULTROW();

    // IUnknown
    STDMETHODIMP QueryInterface(const IID& iid, void **ppv);
    ULONG STDMETHODCALLTYPE AddRef();
    ULONG STDMETHODCALLTYPE Release();

    // IEnumCERTDBRESULTROW
    STDMETHOD(Next)(
	/* [in] */  ICertDBComputedColumn *pIComputedColumn,
	/* [in] */  ULONG            celt,
	/* [out] */ CERTDBRESULTROW *rgelt,
	/* [out] */ ULONG           *pceltFetched);

    STDMETHOD(ReleaseResultRow)(
	/* [in] */      ULONG            celt,
	/* [in, out] */ CERTDBRESULTROW *rgelt);
    
    STDMETHOD(Skip)(
	/* [in] */  LONG  celt,
	/* [out] */ LONG *pielt);
    
    STDMETHOD(Reset)(VOID);
    
    STDMETHOD(Clone)(
	/* [out] */ IEnumCERTDBRESULTROW **ppenum);

    // CEnumCERTDBRESULTROW
    HRESULT Open(
	IN CERTSESSION *pcs,
	IN ICertDB *pdb,
	IN DWORD ccvr,
	IN CERTVIEWRESTRICTION const *acvr,
	IN DWORD ccolOut,
	IN DWORD const *acolOut);

private:
    VOID _Cleanup();

    HRESULT _SetTable(
	IN LONG ColumnIndex,
	OUT LONG *pColumnIndexDefault);

    HRESULT _SaveRestrictions(
	IN DWORD ccvrIn,
	IN CERTVIEWRESTRICTION const *acvrIn,
	IN LONG ColumnIndexDefault);

    // multi-thread handling
    static DWORD WINAPI _ViewWorkThreadFunctionHelper(LPVOID lp);
    HRESULT _HandleThreadError();
    HRESULT _ThreadOpen(DWORD dwCallerThreadID);
    HRESULT _ThreadNext(DWORD dwCallerThreadID);
    VOID    _ThreadCleanup(DWORD dwCallerThreadID);
    DWORD   _ViewWorkThreadFunction(VOID);

    ICertDB             *m_pdb;
    CERTSESSION         *m_pcs;
    CERTVIEWRESTRICTION *m_aRestriction;
    DWORD                m_cRestriction;
    DWORD                m_ccolOut;
    DWORD               *m_acolOut;
    BOOL                 m_fNoMoreData;
    LONG                 m_ieltMax;
    LONG                 m_ielt;
    LONG                 m_cskip;

    // thread stuff
    HANDLE               m_hWorkThread;
    HANDLE               m_hViewEvent;
    HANDLE               m_hReturnEvent;
    HRESULT              m_hrThread;
    ENUMTHREADCALLS      m_enumViewCall;
    VOID                *m_pThreadParam;
    BOOL                 m_fThreading;
//#if DBG_CERTSRV
    DWORD                m_dwCallerThreadId;
//#endif

    // Reference count
    long                 m_cRef;
};