//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File:        request.h
//
// Contents:    Implementation of DCOM object for RPC services
//
// History:     July-97       xtan created
//
//---------------------------------------------------------------------------

// class definition
// Request Interface
class CCertRequestD : public ICertRequestD2
{
public:
    // IUnknown

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

    // ICertRequestD

    virtual STDMETHODIMP Request(
	IN     DWORD                dwFlags,
	IN     wchar_t const       *pwszAuthority,
	IN OUT DWORD               *pdwRequestId,
	OUT    DWORD               *pdwDisposition,
	IN     wchar_t const       *pwszAttributes,
	IN     CERTTRANSBLOB const *pctbRequest,
	OUT    CERTTRANSBLOB       *pctbCertChain,
	OUT    CERTTRANSBLOB       *pctbEncodedCert,
	OUT    CERTTRANSBLOB       *pctbDispositionMessage);

    virtual STDMETHODIMP GetCACert(
	IN  DWORD          Flags,
	IN  wchar_t const *pwszAuthority,
	OUT CERTTRANSBLOB *pctbOut);

    virtual STDMETHODIMP Ping(	// test function
			wchar_t const *pwszAuthority);

    // ICertRequestD2

    virtual STDMETHODIMP Request2( 
	IN     wchar_t const       *pwszAuthority,
	IN     DWORD                dwFlags,
	IN     wchar_t const       *pwszSerialNumber,
	IN OUT DWORD               *pdwRequestId,
	OUT    DWORD               *pdwDisposition,
	IN     wchar_t const       *pwszAttributes,
	IN     CERTTRANSBLOB const *pctbRequest,
	OUT    CERTTRANSBLOB       *pctbFullResponse,
	OUT    CERTTRANSBLOB       *pctbEncodedCert,
	OUT    CERTTRANSBLOB       *pctbDispositionMessage);

    virtual STDMETHODIMP GetCAProperty(
	IN  wchar_t const *pwszAuthority,
	IN  LONG           PropId,	// CR_PROP_*
	IN  LONG           PropIndex,
	IN  LONG           PropType,	// PROPTYPE_*
	OUT CERTTRANSBLOB *pctbPropertyValue);

    virtual STDMETHODIMP GetCAPropertyInfo(
	IN  wchar_t const *pwszAuthority,
	OUT LONG          *pcProperty,
	OUT CERTTRANSBLOB *pctbPropInfo);

    virtual STDMETHODIMP Ping2( 
	IN     wchar_t const *pwszAuthority);
    
    // CCertRequestD

    // Constructor
    CCertRequestD();

    // Destructor
    ~CCertRequestD();

private:
    // this is a test function
    HRESULT _Ping(
        IN wchar_t const *pwszAuthority);

    HRESULT _Request( 
	IN          WCHAR const            *pwszAuthority,
	IN          DWORD                   dwFlags,
	OPTIONAL IN WCHAR const            *pwszSerialNumber,
	IN          DWORD                   dwRequestId,
	OPTIONAL IN WCHAR const            *pwszAttributes,
	OPTIONAL IN CERTTRANSBLOB const    *pctbRequest,
	OUT         CERTSRV_RESULT_CONTEXT *pResult);

private:
    // Reference count
    long m_cRef;
};


// Class of Request factory
class CRequestFactory : public IClassFactory
{
public:
    // IUnknown
    virtual STDMETHODIMP QueryInterface(const IID& iid, void **ppv);
    virtual ULONG STDMETHODCALLTYPE AddRef();
    virtual ULONG STDMETHODCALLTYPE Release();

    // Interface IClassFactory
    virtual STDMETHODIMP CreateInstance(
				    IUnknown *pUnknownOuter,
				    const IID& iid,
				    void **ppv);

    virtual STDMETHODIMP LockServer(BOOL bLock);

    // Constructor
    CRequestFactory() : m_cRef(1) { }

    // Destructor
    ~CRequestFactory() { }

public:
    static HRESULT CanUnloadNow();
    static HRESULT StartFactory();
    static void    StopFactory();

private:
    long m_cRef;
};