/*++

  Copyright (c) 1995  Microsoft Corporation

  Module Name:

  cprinter.hxx

  Abstract:
  Contains definitions for

  CWinNTFSPrintQueueGeneralInfo,
  CWinNTFSPrintQueueOperation and
  CWinNTPrintQueue


  Author:

  Ram Viswanathan (ramv) 11-18-95

  Revision History:

  --*/

class CWinNTFSPrintQueueGeneralInfo;
class CWinNTFSPrintQueueOperation;
class CPropertyCache;

class CWinNTPrintQueue:INHERIT_TRACKING,
		       public ISupportErrorInfo,
                       public IADsPrintQueue,
                       public IADsPrintQueueOperations,
                       public IADsPropertyList,
                       public CCoreADsObject,
                       public INonDelegatingUnknown,
                       public IADsExtension
{

public:
    /* IUnknown methods */
    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj);


    STDMETHODIMP_(ULONG) AddRef(void);

    STDMETHODIMP_(ULONG) Release(void);

    // INonDelegatingUnknown methods

    STDMETHOD(NonDelegatingQueryInterface)(THIS_
        const IID&,
        void **
        );

    DECLARE_NON_DELEGATING_REFCOUNTING

    DECLARE_IDispatch_METHODS;

    DECLARE_ISupportErrorInfo_METHODS;

    DECLARE_IADs_METHODS;

    DECLARE_IADsPrintQueue_METHODS;

    DECLARE_IADsPrintQueueOperations_METHODS;

    DECLARE_IADsPropertyList_METHODS;

    DECLARE_IADsExtension_METHODS

    //
    // constructor and destructor
    //

    CWinNTPrintQueue();

    ~CWinNTPrintQueue();

    static
    HRESULT
    CreatePrintQueue(LPTSTR lpszADsParent,
                     DWORD  dwParentId,
                     LPTSTR pszDomainName,
                     LPTSTR pszServerName,
                     LPTSTR pszPrinterName,
                     DWORD  dwObjectState,
                     REFIID riid,
		     CWinNTCredentials& Credentials,
                     LPVOID * ppvoid
                     );

    static
    HRESULT
    CWinNTPrintQueue::AllocatePrintQueueObject(LPTSTR pszServerName,
                                               LPTSTR pszPrinterName,
                                               CWinNTPrintQueue ** ppPrintQueue
                                               );


    HRESULT
    CWinNTPrintQueue::MarshallAndSet(LPPRINTER_INFO_2 lpPrinterInfo2
                                     );






    HRESULT
    CWinNTPrintQueue::UnMarshall(LPPRINTER_INFO_2 lpPrinterInfo2,
                                 BOOL fExplicit
                                 );


#if (!defined(BUILD_FOR_NT40))
    HRESULT
    CWinNTPrintQueue::MarshallAndSet(LPPRINTER_INFO_7 lpPrinterInfo7
                                        );


    HRESULT
    CWinNTPrintQueue::UnMarshall7(LPPRINTER_INFO_7 lpPrinterInfo7,
                                 BOOL fExplicit
                                 );
#endif

    STDMETHOD(ImplicitGetInfo)(void);

protected:

    STDMETHOD(GetInfo)(THIS_ DWORD dwApiLevel, BOOL fExplicit) ;

    HRESULT WinNTAddPrinter();


    CWinNTFSPrintQueueGeneralInfo  *_pGenInfoPS;
    CWinNTFSPrintQueueOperation  *_pOperationPS;
    CAggregatorDispMgr  * _pDispMgr;
    CADsExtMgr FAR * _pExtMgr;
    LPWSTR            _pszPrinterName; // Caches UNC name
    CPropertyCache * _pPropertyCache;
    CWinNTCredentials _Credentials;
};

typedef CWinNTPrintQueue *PCWinNTPrintQueue;