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

/*
 *  History:
 *	gregj	20-May-1991	Cloned from SERVER_ENUM
 *	gregj	23-May-1991	Added LOCATION support
 *	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructors
 *	KeithMo	07-Oct-1991	Win32 Conversion.
 *	JonN	29-Jan-1992	Added resumable iterator
 *	JonN	13-Mar-1992	Moved NT enumerator to lmoent.hxx
 *      Yi-HsinS18-Sep-1992     Make USER_ENUM resumable.
 *
 */


#ifndef _LMOEUSR_HXX_
#define _LMOEUSR_HXX_

#include "lmoersm.hxx"


/**********************************************************\

    NAME:	USER_ENUM

    SYNOPSIS:	User enumeration class

    INTERFACE:	See derived USERx_ENUM classes

    PARENT:	LOC_LM_ENUM

    USES:

    HISTORY:
	gregj	20-May-1991	Cloned from SERVER_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS USER_ENUM : public LOC_LM_RESUME_ENUM
{
private:
    NLS_STR _nlsGroupName;
    ULONG   _ResumeHandle;

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

protected:
    USER_ENUM ( const TCHAR * pszLocation,
		UINT	     level,
		const TCHAR * pszGroupName = NULL,
                BOOL  fKeepBuffers = FALSE );

    USER_ENUM ( LOCATION_TYPE locType,
		UINT	      level,
		const TCHAR  * pszGroupName = NULL,
                BOOL  fKeepBuffers = FALSE );

    USER_ENUM ( const LOCATION & loc,
		UINT		 level,
		const TCHAR     * pszGroupName = NULL,
                BOOL  fKeepBuffers = FALSE );

};  // class USER_ENUM


/**********************************************************\

    NAME:	USER0_ENUM

    SYNOPSIS:	User enumeration, level 0

    INTERFACE:
		USER0_ENUM() - construct with location
		    string or type, optional group name

    PARENT:	USER_ENUM

    USES:

    CAVEATS:	This assumes that the data structures used by
		NetUserEnum level 0 (user_info_0) and by
		NetGroupGetUsers (group_users_info_0) are
		identical.  This assumption is asserted in
		the class definition.

    HISTORY:
	gregj	20-May-1991	Cloned from SERVER1_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS USER0_ENUM : public USER_ENUM
{
public:
    USER0_ENUM( const TCHAR * pszLocation,
		const TCHAR * pszGroupName = NULL,
                BOOL  fKeepBuffers = FALSE );

    USER0_ENUM( LOCATION_TYPE locType,
		const TCHAR * pszGroupName = NULL,
                BOOL  fKeepBuffers = FALSE );

    USER0_ENUM( const LOCATION & loc,
		const TCHAR * pszGroupName = NULL,
                BOOL  fKeepBuffers = FALSE );

};  // class USER0_ENUM


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

    NAME:	USER0_ENUM_OBJ

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

    INTERFACE:	USER0_ENUM_OBJ		- Class constructor.

    		~USER0_ENUM_OBJ		- Class destructor.

		QueryBufferPtr		- Replaces ENUM_OBJ_BASE method.

		QueryName		- Returns the user name.

    PARENT:	ENUM_OBJ_BASE

    HISTORY:
	KeithMo	    07-Oct-1991	Created.

**************************************************************************/
DLL_CLASS USER0_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

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

    DECLARE_ENUM_BUFFER_METHODS( struct user_info_0 );

    //
    //	Accessors.
    //

    DECLARE_ENUM_ACCESSOR( QueryName, const TCHAR *, usri0_name );

};  // class USER0_ENUM_OBJ


DECLARE_LM_RESUME_ENUM_ITER_OF( USER0, struct user_info_0 );


/**********************************************************\

    NAME:	USER1_ENUM

    SYNOPSIS:	User enumeration, level 1

    INTERFACE:
		USER1_ENUM() - construct with location string
		    or type code

    PARENT:	USER_ENUM

    USES:

    HISTORY:
	gregj	20-May-1991	Cloned from SERVER1_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS USER1_ENUM : public USER_ENUM
{
public:
    USER1_ENUM( const TCHAR * pszLocation,
                BOOL  fKeepBuffers = FALSE );

    USER1_ENUM( LOCATION_TYPE locType,
                BOOL  fKeepBuffers = FALSE );

    USER1_ENUM( const LOCATION & loc,
                BOOL  fKeepBuffers = FALSE );

};  // class USER1_ENUM


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

    NAME:	USER1_ENUM_OBJ

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

    INTERFACE:	USER1_ENUM_OBJ		- Class constructor.

    		~USER1_ENUM_OBJ		- Class destructor.

		QueryBufferPtr		- Replaces ENUM_OBJ_BASE method.

		QueryName		- Returns the user name.

		QueryPasswordAge	- Returns the password age.

		QueryPriv		- Returns privilege information.

		QueryHomeDir		- Returns the user's home directory.

		QueryComment		- Returns the comment.

		QueryFlags		- Returns the user flags.

		QueryScriptPath		- Returns the user's script path.

    PARENT:	ENUM_OBJ_BASE

    HISTORY:
	KeithMo	    07-Oct-1991	Created.

**************************************************************************/
DLL_CLASS USER1_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

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

    DECLARE_ENUM_BUFFER_METHODS( struct user_info_1 );

    //
    //	Accessors.
    //

    DECLARE_ENUM_ACCESSOR( QueryName,        const TCHAR *, usri1_name);
    DECLARE_ENUM_ACCESSOR( QueryPasswordAge, ULONG,	    usri1_password_age);
    DECLARE_ENUM_ACCESSOR( QueryPriv,	     UINT,	    usri1_priv);
    DECLARE_ENUM_ACCESSOR( QueryHomeDir,     const TCHAR *, usri1_home_dir);
    DECLARE_ENUM_ACCESSOR( QueryComment,     const TCHAR *, usri1_comment);
    DECLARE_ENUM_ACCESSOR( QueryFlags,	     UINT,	    usri1_flags);
    DECLARE_ENUM_ACCESSOR( QueryScriptPath,  const TCHAR *, usri1_script_path);

};  // class USER1_ENUM_OBJ


DECLARE_LM_RESUME_ENUM_ITER_OF( USER1, struct user_info_1 );


/**********************************************************\

    NAME:	USER2_ENUM

    SYNOPSIS:	User enumeration, level 2

    INTERFACE:
		USER2_ENUM() - construct with location string
		    or type code

    PARENT:	USER_ENUM

    USES:

    HISTORY:
	gregj	20-May-1991	Cloned from SERVER1_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS USER2_ENUM : public USER_ENUM
{
public:
    USER2_ENUM( const TCHAR * pszLocation,
                BOOL  fKeepBuffers = FALSE );

    USER2_ENUM( LOCATION_TYPE locType,
                BOOL  fKeepBuffers = FALSE );

    USER2_ENUM( const LOCATION & loc,
                BOOL  fKeepBuffers = FALSE );

};  // class USER2_ENUM


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

    NAME:	USER2_ENUM_OBJ

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

    INTERFACE:	USER2_ENUM_OBJ		- Class constructor.

    		~USER2_ENUM_OBJ		- Class destructor.

		QueryBufferPtr		- Replaces ENUM_OBJ_BASE method.

		QueryName		- Returns the user name.

		QueryPasswordAge	- Returns the password age.

		QueryPriv		- Returns privilege information.

		QueryHomeDir		- Returns the user's home directory.

		QueryComment		- Returns the comment.

		QueryFlags		- Returns the user flags.

		QueryScriptPath		- Returns the user's script path.

		QueryAuthFlags		- Returns the authorization flags.

		QueryFullName		- Returns the user's full name.

		QueryUserComment	- Returns the user comment.

		QueryParms		- Returns the application parameters.

		QueryWorkstations	- Returns the names of the workstations
					  that the user can log into.

		QueryLastLogon		- Returns the time of last logon.

		QueryLastLogoff		- Returns the time of last logoff.

		QueryAccountExpires	- Returns the account expiration date.

		QueryMaxStorage		- Returns the user's disk space quota.

		QueryUnitsPerWeek	- ?

		QueryLogonHours		- Returns the allowed logon hours.

		QueryBadPWCount		- Returns the number of attempts to
					  log into this account with a bad
					  password.

		QueryNumLogons		- Returns the number of successful
					  logon attempts for this account.

		QueryLogonServer	- Returns the logon server.

		QueryCountryCode	- Returns the country code for this
					  user.

		QueryCodePage		- Returns the code page for this user.


    PARENT:	ENUM_OBJ_BASE

    HISTORY:
	KeithMo	    07-Oct-1991	Created.

**************************************************************************/
DLL_CLASS USER2_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

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

    DECLARE_ENUM_BUFFER_METHODS( struct user_info_2 );

    //
    //	Accessors.
    //

    DECLARE_ENUM_ACCESSOR( QueryName,        const TCHAR *, usri2_name );
    DECLARE_ENUM_ACCESSOR( QueryPasswordAge, ULONG,	   usri2_password_age );
    DECLARE_ENUM_ACCESSOR( QueryPriv,	     UINT,	   usri2_priv );
    DECLARE_ENUM_ACCESSOR( QueryHomeDir,     const TCHAR *, usri2_home_dir );
    DECLARE_ENUM_ACCESSOR( QueryComment,     const TCHAR *, usri2_comment );
    DECLARE_ENUM_ACCESSOR( QueryFlags,	     UINT,	   usri2_flags );
    DECLARE_ENUM_ACCESSOR( QueryScriptPath,  const TCHAR *, usri2_script_path );
    DECLARE_ENUM_ACCESSOR( QueryAuthFlags,   ULONG,	   usri2_auth_flags );
    DECLARE_ENUM_ACCESSOR( QueryFullName,    const TCHAR *, usri2_full_name );
    DECLARE_ENUM_ACCESSOR( QueryUserComment, const TCHAR *, usri2_usr_comment );
    DECLARE_ENUM_ACCESSOR( QueryParms,	     const TCHAR *, usri2_parms );
    DECLARE_ENUM_ACCESSOR( QueryWorkstations,const TCHAR *, usri2_workstations );
    DECLARE_ENUM_ACCESSOR( QueryLastLogon,   LONG,	   usri2_last_logon );
    DECLARE_ENUM_ACCESSOR( QueryLastLogoff,  LONG,	   usri2_last_logoff );
    DECLARE_ENUM_ACCESSOR( QueryAccountExpires,LONG,	   usri2_acct_expires );
    DECLARE_ENUM_ACCESSOR( QueryMaxStorage,  ULONG,	   usri2_max_storage );
    DECLARE_ENUM_ACCESSOR( QueryUnitsPerWeek,UINT,	   usri2_units_per_week );
    DECLARE_ENUM_ACCESSOR( QueryBadPWCount,  UINT,	   usri2_bad_pw_count );
    DECLARE_ENUM_ACCESSOR( QueryNumLogons,   UINT,	   usri2_num_logons );
    DECLARE_ENUM_ACCESSOR( QueryLogonServer, const TCHAR *, usri2_logon_server );
    DECLARE_ENUM_ACCESSOR( QueryCountryCode, UINT,	   usri2_country_code );
    DECLARE_ENUM_ACCESSOR( QueryCodePage,    UINT,	   usri2_code_page );

};  // class USER2_ENUM_OBJ


DECLARE_LM_RESUME_ENUM_ITER_OF( USER2, struct user_info_2 );


/**********************************************************\

    NAME:	USER10_ENUM

    SYNOPSIS:	User enumeration, level 10

    INTERFACE:
		USER10_ENUM() - construct with location string
		    or type code

    PARENT:	USER_ENUM

    USES:

    HISTORY:
	gregj	20-May-1991	Cloned from SERVER1_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS USER10_ENUM : public USER_ENUM
{
public:
    USER10_ENUM( const TCHAR * pszLocation,
                 BOOL  fKeepBuffers = FALSE );

    USER10_ENUM( LOCATION_TYPE locType,
                 BOOL  fKeepBuffers = FALSE );

    USER10_ENUM( const LOCATION & loc,
                 BOOL  fKeepBuffers = FALSE );

};  // class USER10_ENUM


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

    NAME:	USER10_ENUM_OBJ

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

    INTERFACE:	USER10_ENUM_OBJ		- Class constructor.

    		~USER10_ENUM_OBJ	- Class destructor.

		QueryBufferPtr		- Replaces ENUM_OBJ_BASE method.

		QueryName		- Returns the user name.

		QueryComment		- Returns the comment.

		QueryUserComment	- Returns the user comment.

		QueryFullName		- Returns the user's full name.

    PARENT:	ENUM_OBJ_BASE

    HISTORY:
	KeithMo	    07-Oct-1991	Created.

**************************************************************************/
DLL_CLASS USER10_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

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

    DECLARE_ENUM_BUFFER_METHODS( struct user_info_10 );

    //
    //	Accessors.
    //

    DECLARE_ENUM_ACCESSOR( QueryName,        const TCHAR *, usri10_name);
    DECLARE_ENUM_ACCESSOR( QueryComment,     const TCHAR *, usri10_comment);
    DECLARE_ENUM_ACCESSOR( QueryUserComment, const TCHAR *, usri10_usr_comment);
    DECLARE_ENUM_ACCESSOR( QueryFullName,    const TCHAR *, usri10_full_name);

};  // class USER10_ENUM_OBJ


DECLARE_LM_RESUME_ENUM_ITER_OF( USER10, struct user_info_10 );


/************************ GROUPS ************************/

/**********************************************************\

    NAME:	GROUP_ENUM

    SYNOPSIS:	Group enumeration class

    INTERFACE:	See derived GROUPx_ENUM classes

    PARENT:	LOC_LM_ENUM

    HISTORY:
	gregj	21-May-1991	Cloned from USER_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS GROUP_ENUM : public LOC_LM_ENUM
{
private:
    const TCHAR * _pszUserName;

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

protected:
    GROUP_ENUM ( const TCHAR * pszLocation,
		 UINT	      level,
		 const TCHAR * pszUserName = NULL );

    GROUP_ENUM ( LOCATION_TYPE locType,
		 UINT	       level,
		 const TCHAR  * pszUserName = NULL );

    GROUP_ENUM ( const LOCATION & loc,
		 UINT		  level,
		 const TCHAR     * pszUserName = NULL );

};  // class GROUP_ENUM


/**********************************************************\

    NAME:	GROUP0_ENUM

    SYNOPSIS:	Group enumeration, level 0

    INTERFACE:
		GROUP0_ENUM() - construct with location string
		    or type code, optional user name

    PARENT:	GROUP_ENUM

    HISTORY:
	gregj	21-May-1991	Cloned from USER1_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS GROUP0_ENUM : public GROUP_ENUM
{
public:
    GROUP0_ENUM( const TCHAR * pszLocation,
		 const TCHAR * pszUserName = NULL );

    GROUP0_ENUM( LOCATION_TYPE locType,
		 const TCHAR * pszUserName = NULL );

    GROUP0_ENUM( const LOCATION & loc,
		 const TCHAR * pszUserName = NULL );

};  // class GROUP0_ENUM


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

    NAME:	GROUP0_ENUM_OBJ

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

    INTERFACE:	GROUP0_ENUM_OBJ		- Class constructor.

    		~GROUP0_ENUM_OBJ	- Class destructor.

		QueryBufferPtr		- Replaces ENUM_OBJ_BASE method.

		QueryName		- Returns the group name.

    PARENT:	ENUM_OBJ_BASE

    HISTORY:
	KeithMo	    07-Oct-1991	Created.

**************************************************************************/
DLL_CLASS GROUP0_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

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

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

    VOID SetBufferPtr( const struct group_info_0 * pBuffer );

    //
    //	Accessors.
    //

    DECLARE_ENUM_ACCESSOR( QueryName, const TCHAR *, grpi0_name );

};  // class GROUP0_ENUM_OBJ


DECLARE_LM_ENUM_ITER_OF( GROUP0, struct group_info_0 );


/**********************************************************\

    NAME:	GROUP1_ENUM

    SYNOPSIS:	Group enumeration, level 1

    INTERFACE:
		GROUP1_ENUM() - construct with location string
		    or type code

    PARENT:	GROUP_ENUM

    HISTORY:
	gregj	21-May-1991	Cloned from USER1_ENUM
	gregj	23-May-1991	Added LOCATION support
	rustanl 18-Jul-1991	Added ( const LOCATION & ) constructor
	KeithMo	07-Oct-1991	Changed all USHORTs to UINTs.

\**********************************************************/

DLL_CLASS GROUP1_ENUM : public GROUP_ENUM
{
public:
    GROUP1_ENUM( const TCHAR * pszLocation );

    GROUP1_ENUM( LOCATION_TYPE locType );

    GROUP1_ENUM( const LOCATION & loc );

};  // class GROUP1_ENUM


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

    NAME:	GROUP1_ENUM_OBJ

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

    INTERFACE:	GROUP1_ENUM_OBJ		- Class constructor.

    		~GROUP1_ENUM_OBJ	- Class destructor.

		QueryBufferPtr		- Replaces ENUM_OBJ_BASE method.

		QueryName		- Returns the group name.

		QueryComment		- Returns the group comment.

    PARENT:	ENUM_OBJ_BASE

    HISTORY:
	KeithMo	    07-Oct-1991	Created.

**************************************************************************/
DLL_CLASS GROUP1_ENUM_OBJ : public ENUM_OBJ_BASE
{
public:

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

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

    VOID SetBufferPtr( const struct group_info_1 * pBuffer );

    //
    //	Accessors.
    //

    DECLARE_ENUM_ACCESSOR( QueryName,    const TCHAR *, grpi1_name );
    DECLARE_ENUM_ACCESSOR( QueryComment, const TCHAR *, grpi1_comment );

};  // class GROUP1_ENUM_OBJ


DECLARE_LM_ENUM_ITER_OF( GROUP1, struct group_info_1 );


#endif	// _LMOEUSR_HXX_