/*****************************************************************************\
* MODULE:       request.h
*
* PURPOSE:      Implementation of COM interface for BidiSpooler
*
* Copyright (C) 2000 Microsoft Corporation
*
* History:
*
*     03/07/00  Weihai Chen (weihaic) Created
*
\*****************************************************************************/

#ifndef _TBIDIREQUEST
#define _TBIDIREQUEST

#include "priv.h"

class TBidiRequest : public IBidiRequestSpl
{
public:
	// IUnknown
	STDMETHOD (QueryInterface) (
        REFIID  iid,
        void**  ppv) ;
    
	STDMETHOD_ (ULONG, AddRef) () ;
    
	STDMETHOD_ (ULONG, Release)() ;
    
    STDMETHOD (SetSchema) ( 
        IN  CONST   LPCWSTR pszSchema);
        
    STDMETHOD (SetInputData) ( 
        IN  CONST   DWORD   dwType,
        IN  CONST   BYTE    *pData,
        IN  CONST   UINT    uSize);
        
    STDMETHOD (GetResult) ( 
        OUT         HRESULT *phr);
        
    STDMETHOD (GetOutputData) ( 
        IN  CONST   DWORD   dwIndex,
        OUT         LPWSTR  *ppszSchema,
        OUT         PDWORD  pdwType,
        OUT         PBYTE   *ppData,
        OUT         PULONG  uSize);
        
    STDMETHOD (GetEnumCount)(
        OUT         PDWORD  pdwTotal);
    
    STDMETHOD (GetSchema) (
        OUT         LPWSTR  *ppszSchema);

    STDMETHOD (GetInputData)  (
        OUT         PDWORD  pdwType,
        OUT         PBYTE   *ppData,
        OUT         PULONG  puSize);
                
    STDMETHOD (SetResult) (
        IN  CONST   HRESULT hr);

    STDMETHOD (AppendOutputData) (
        IN  CONST   LPCWSTR pszSchema,
        IN  CONST   DWORD   dwType, 
        IN  CONST   BYTE    *pData,
        IN  CONST   ULONG   uSize);
    
    // Constructor
	TBidiRequest() ;

    // Destructor
    ~TBidiRequest() ;
    
    inline BOOL 
    bValid() CONST {return m_bValid;};

private:
	// Reference count
    BOOL                m_bValid;
    LONG                m_cRef ;
    LPWSTR              m_pSchema;
    BIDI_TYPE           m_kDataType;
    DWORD               m_dwDataSize;
    PBYTE               m_pbData;
    DWORD               m_dwResponseCount;
    HRESULT             m_hr;
    TCriticalSection    m_CritSec;
    TResponseDataList   m_ResponseDataList;

} ;

#endif