/**********************************************************************/
/**                       Microsoft LAN Manager                      **/
/**             Copyright(c) Microsoft Corp., 1990, 1991             **/
/**********************************************************************/

/*
    lmoetd.hxx

    This file contains the class declarations for the TRUSTED_DOMAIN_ENUM
    class and its associated iterator classes.


    FILE HISTORY:
        KeithMo     09-Apr-1992     Created for the Server Manager.

*/

#ifndef _LMOETD_HXX_
#define _LMOETD_HXX_

#ifndef WIN32
#error NT enumerator requires WIN32!
#endif // WIN32

#include "lmoersm.hxx"
#include "uintlsa.hxx"


/*************************************************************************

    NAME:       TRUSTED_DOMAIN_ENUM

    SYNOPSIS:   The TRUSTED_DOMAIN_ENUM enumerator is used to enumerate
                the domains "trusted" by a specific target domain.

    INTERFACE:  TRUSTED_DOMAIN_ENUM     - Class constructor.

                ~TRUSTED_DOMAIN_ENUM    - Class destructor.

                CallAPI                 - Invokes the enumeration API.

    PARENT:     LM_RESUME_ENUM

    HISTORY:
        KeithMo     09-Apr-1992     Created for the Server Manager.

**************************************************************************/
DLL_CLASS TRUSTED_DOMAIN_ENUM : public LM_RESUME_ENUM
{
private:

    //
    //  The LsaEnumerateTrustedDomain() resume key.
    //

    LSA_ENUMERATION_HANDLE _ResumeKey;

    //
    //  This LSA_POLICY object represents the target server on which
    //  the enumeration will be performed.
    //

    const LSA_POLICY * _plsapolicy;

    //
    //  This is a wrapper around the LSA_TRUST_INFORMATION structure
    //  (as returned by LSA_POLICY::EnumerateTrustedDomains).
    //

    LSA_TRUST_INFO_MEM _lsatim;

    //
    //  This virtual callback invokes the LsaEnumerateTrustedDomains() API
    //  through LSA_POLICY::EnumerateTrustedDomains().
    //

    virtual APIERR CallAPI( BOOL    fRestartEnum,
                            BYTE ** ppbBuffer,
                            UINT  * pcEntriesRead );

protected:

    //
    //  Destroy the buffer with ::LsaFreeMemory().
    //

    virtual VOID FreeBuffer( BYTE ** ppbBuffer );

public:

    //
    //  Usual constructor/destructor goodies.
    //

    TRUSTED_DOMAIN_ENUM( const LSA_POLICY * plsapolicy,
                         BOOL               fKeepBuffers = FALSE );

    ~TRUSTED_DOMAIN_ENUM( VOID );

};  // class TRUSTED_DOMAIN_ENUM


class TRUSTED_DOMAIN_ITER;              // Forward reference.


/*************************************************************************

    NAME:       TRUSTED_DOMAIN_ENUM_OBJ

    SYNOPSIS:   This is basically the return type from the
                TRUSTED_DOMAIN_ENUM_ITER iterator.

    INTERFACE:  QueryUnicodeDomainName  - Returns a UNICODE_STRING *
                                          for the domain name.

                QueryDomainName         - Also returns the domain name,
                                          but stores it in an NLS_STR.

                QueryDomainSID          - Returns the domain's SID
                                          (actually a PSID).

    PARENT:     ENUM_OBJ_BASE

    HISTORY:
        KeithMo     09-Apr-1992     Created for the Server Manager.

**************************************************************************/
DLL_CLASS TRUSTED_DOMAIN_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

    //
    //  Provide properly-casted buffer Query/Set methods.
    //

    const LSA_TRUST_INFORMATION * QueryBufferPtr( VOID ) const
        { return (const LSA_TRUST_INFORMATION *)ENUM_OBJ_BASE::QueryBufferPtr(); }

    VOID SetBufferPtr( const LSA_TRUST_INFORMATION * pBuffer )
        { ENUM_OBJ_BASE::SetBufferPtr( (const BYTE *)pBuffer ); }

    //
    //  Accessors.
    //

    const UNICODE_STRING * QueryUnicodeDomainName( VOID ) const
        { return &(QueryBufferPtr()->Name); }

    APIERR QueryDomainName( NLS_STR * pnls ) const
        {
            ASSERT( pnls != NULL );
            ASSERT( pnls->QueryError() == NERR_Success );
            return pnls->MapCopyFrom( QueryUnicodeDomainName()->Buffer,
                                      QueryUnicodeDomainName()->Length );
        }

    DECLARE_ENUM_ACCESSOR( QueryDomainSID, PSID, Sid );

};  // class TRUSTED_DOMAIN_ENUM_OBJ


DECLARE_LM_RESUME_ENUM_ITER_OF( TRUSTED_DOMAIN, LSA_TRUST_INFORMATION );


#endif  // _LMOETD_HXX_