class CLDAPUser;



//
// Structure definition for list used to track servers support
// for SSL to speedup Set/ChangePassword
//
typedef struct _ServSSLEntry
{
    LPWSTR pszServerName;
    DWORD  dwFlags;
    struct _ServSSLEntry *pNext;
} SERVSSLENTRY, *PSERVSSLENTRY;

//
// These are bit masks
//
#define SERVER_STATUS_UNKNOWN 0x0
#define SERVER_DOES_NOT_SUPPORT_SSL 0x1
#define SERVER_DOES_NOT_SUPPORT_KERBEROS 0x2
#define SERVER_DOES_NOT_SUPPORT_NETUSER 0x4

//
// Routines to Access/Manipulate and delete the list
//
DWORD ReadServerSupportsSSL( LPWSTR pszServerName);

HRESULT AddServerSSLSupportStatus(
           LPWSTR pszServerName,
           DWORD dwFlags
           );

void FreeServerSSLSupportList();

	
class CLDAPUser : INHERIT_TRACKING,
                    public IADsUser,
                    public IPrivateUnknown,
                    public IPrivateDispatch,
                    public IADsExtension,
                    public INonDelegatingUnknown

{
public:

    //
    // IUnknown methods
    //

    STDMETHOD(QueryInterface)(THIS_ REFIID riid, LPVOID FAR* ppvObj) ;

    DECLARE_DELEGATING_REFCOUNTING


    //
    // INonDelegatingUnkown methods declaration for NG_QI, definition for
    // NG_AddRef adn NG_Release.
    //

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

    DECLARE_NON_DELEGATING_REFCOUNTING


    DECLARE_IDispatch_METHODS

    DECLARE_IPrivateUnknown_METHODS

    DECLARE_IPrivateDispatch_METHODS


    STDMETHOD(Operate)(
        THIS_
        DWORD   dwCode,
        VARIANT varUserName,
        VARIANT varPassword,
        VARIANT varReserved
        );

    STDMETHOD(PrivateGetIDsOfNames)(
        THIS_
        REFIID riid,
        OLECHAR FAR* FAR* rgszNames,
        unsigned int cNames,
        LCID lcid,
        DISPID FAR* rgdispid) ;

    STDMETHOD(PrivateInvoke)(
        THIS_
        DISPID dispidMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS FAR* pdispparams,
        VARIANT FAR* pvarResult,
        EXCEPINFO FAR* pexcepinfo,
        unsigned int FAR* puArgErr
        ) ;



    DECLARE_IADs_METHODS

    DECLARE_IADsUser_METHODS

    CLDAPUser::CLDAPUser();

    CLDAPUser::~CLDAPUser();

   static
   HRESULT
   CLDAPUser::CreateUser(
       IUnknown *pUnkOuter,
       REFIID riid,
       void **ppvObj
       );

protected:

    IADs * _pADs;

    CAggregateeDispMgr FAR * _pDispMgr;

    CCredentials  _Credentials;

    BOOL _fDispInitialized;

private:

    HRESULT
    InitCredentials(
        VARIANT * pvarUserName,
        VARIANT * pvarPassword,
        VARIANT * pdwAuthFlags
        );

};