/**********************************************************************/
/**			  Microsoft Windows NT	 		     **/
/**		Copyright(c) Microsoft Corp., 1991  		     **/
/**********************************************************************/

/*
   server.cxx
     This file contains the definition of SERVER_PARAMETERS_DIALOG.
 
   History:
     NarenG		12/15/92	Created.
*/

#define INCL_WINDOWS_GDI
#define INCL_WINDOWS
#define INCL_DOSERRORS
#define INCL_NETERRORS
#define INCL_NETSHARE
#define INCL_NETSERVER
#define INCL_NETCONS
#define INCL_NETLIB
#include <lmui.hxx>

#define INCL_BLT_WINDOW
#define INCL_BLT_DIALOG
#define INCL_BLT_CONTROL
#define INCL_BLT_MISC
#define INCL_BLT_CLIENT
#define INCL_BLT_MSGPOPUP
#define INCL_BLT_SPIN_GROUP
#define INCL_BLT_GROUP
#include <blt.hxx>

extern "C"
{
#include <afpmgr.h>
#include <macfile.h>
}

#include <string.hxx>
#include <uitrace.hxx>
#include <dbgstr.hxx>
#include <netname.hxx>

#include "util.hxx"
#include "srvname.hxx"
#include "server.hxx"

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

    NAME:	SERVER_PARAMETERS_DIALOG::SERVER_PARAMETERS_DIALOG

    SYNOPSIS:   Constructor for SERVER_PARAMETERS_DIALOG class

    ENTRY:      hwndParent     - handle of parent window

    EXIT:

    RETURNS:

    NOTES:

    HISTORY:
	NarenG		12/15/92		Created

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

SERVER_PARAMETERS_DIALOG::SERVER_PARAMETERS_DIALOG( 
				 	HWND 		  hwndParent,
				        AFP_SERVER_HANDLE hServer,
					const TCHAR * 	  pszServerName )
    : DIALOG_WINDOW( MAKEINTRESOURCE( IDD_SERVER_PARAMETERS_DIALOG ), 
		     hwndParent ),
      _sltServerName( this, IDSP_SLT_SERVERNAME, ELLIPSIS_RIGHT ),
      _mleTextMsg( this, IDSP_MLE_LOGINMSG, AFP_MESSAGE_LEN ),
      _chkAllowPasswordSaves( this,IDSP_CHK_PASSWORD_SAVES ),
      _chkAllowGuestLogons( this, IDSP_CHK_GUESTLOGONS ),
      _chkAllowClearTextPasswords( this,IDSP_CHK_CLEARTEXT ),
      _mgrpSessionLimit( this, IDSP_RB_UNLIMITED, 2, IDSP_RB_UNLIMITED),  
      _spsleSessions( this, IDSP_SLE_SESSIONS, 1, 1, AFP_MAXSESSIONS-1, 
                      TRUE, IDSP_SLE_SESSIONS_GROUP ),
      _spgrpSessions(this,IDSP_SB_SESSIONS_GROUP, IDSP_SB_SESSIONS_UP,
		  IDSP_SB_SESSIONS_DOWN),
      _pbChange( this, IDSP_PB_CHANGE ),
      _dwParmNum( 0 ),
      _hServer( hServer )
{

    UNREFERENCED( pszServerName );

    // 
    // Make sure everything constructed OK
    //

    if ( QueryError() != NERR_Success )
        return;

    APIERR err;
    if (  ((err = _mgrpSessionLimit.QueryError()) != NERR_Success )
       || ((err = _spgrpSessions.AddAssociation(&_spsleSessions))!=NERR_Success)
       || ((err = _mgrpSessionLimit.AddAssociation( IDSP_RB_SESSIONS,
						    &_spgrpSessions ))
	          				   != NERR_Success ) 
       || ((err = _pbChange.QueryError()) != NERR_Success )
       || ((err = _chkAllowPasswordSaves.QueryError()) != NERR_Success )
       || ((err = _chkAllowGuestLogons.QueryError()) != NERR_Success )
       || ((err = _chkAllowClearTextPasswords.QueryError()) != NERR_Success )
       || ((err = _mleTextMsg.QueryError()) != NERR_Success )
       || ((err = _sltServerName.QueryError()) != NERR_Success )
       ) 
    {
        ReportError( err );
        return;
    }

    //
    //  Just to be cool...
    //

    AUTO_CURSOR Cursor;

    err = BASE_ELLIPSIS::Init();

    if( err != NO_ERROR )
    {
        ReportError( err );
	return;
    }

    //
    //  Set the caption to "SFM Server Attributes of Server".
    //

    err = ::SetCaption( this, IDS_CAPTION_ATTRIBUTES, pszServerName );

    if( err != NERR_Success )
    {
        ReportError( err );
        return;
    }

    //
    // Get the server information.
    //

    PAFP_SERVER_INFO pAfpServerInfo;

    err = ::AfpAdminServerGetInfo( _hServer, (LPBYTE*)&pAfpServerInfo );

    if ( err != NO_ERROR )
    {
	ReportError( AFPERR_TO_STRINGID( err ) );
	return;
    }

    // 
    // Set the information
    // 

    _sltServerName.SetText( pAfpServerInfo->afpsrv_name );

    _chkAllowPasswordSaves.SetCheck( 
				(INT)(pAfpServerInfo->afpsrv_options &
				      AFP_SRVROPT_ALLOWSAVEDPASSWORD ));

    _chkAllowGuestLogons.SetCheck( 
				(INT)(pAfpServerInfo->afpsrv_options &
		     		      AFP_SRVROPT_GUESTLOGONALLOWED ));

    _chkAllowClearTextPasswords.SetCheck( 
				(INT)(!(pAfpServerInfo->afpsrv_options &
				       AFP_SRVROPT_CLEARTEXTLOGONALLOWED )));

    SetSessionLimit( pAfpServerInfo->afpsrv_max_sessions );
	
    _mleTextMsg.SetText( pAfpServerInfo->afpsrv_login_msg );

    //
    //  Direct the message edit control not to add end-of-line
    //  character from wordwrapped text lines.
    //

    _mleTextMsg.SetFmtLines(FALSE);

    ::AfpAdminBufferFree( pAfpServerInfo );

    _pbChange.ClaimFocus();
}

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

    NAME:       SERVER_PARAMETERS_DIALOG :: ~SERVER_PARAMETERS_DIALOG

    SYNOPSIS:   SERVER_PARAMETERS_DIALOG class destructor.

    EXIT:       The object is destroyed.

    HISTORY:
	NarenG	    02-Oct-1993 Stole from Server Manager and folded
				BASE_RES_DIALOG and FILES_DIALOG into one.

********************************************************************/
SERVER_PARAMETERS_DIALOG :: ~SERVER_PARAMETERS_DIALOG()
{
    BASE_ELLIPSIS::Term();

}   // SERVER_PARAMETERS_DIALOG :: ~SERVER_PARAMETERS_DIALOG

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

    NAME:       SERVER_PARAMETERS_DIALOG :: OnCommand

    SYNOPSIS:   This method is called whenever a WM_COMMAND message
                is sent to the dialog procedure.

    ENTRY:      cid                     - The control ID from the
                                          generating control.

    EXIT:       The command has been handled.

    RETURNS:    BOOL                    - TRUE  if we handled the command.
                                          FALSE if we did not handle
                                          the command.

    HISTORY:
	NarenG	    02-Oct-1993 Stole from Server Manager and folded
				BASE_RES_DIALOG and FILES_DIALOG into one.

********************************************************************/
BOOL SERVER_PARAMETERS_DIALOG :: OnCommand( const CONTROL_EVENT & event )
{

    DWORD err;

    if( event.QueryCid() == _pbChange.QueryCid() )
    {
    	//
    	//  Just to be cool...
    	//

    	AUTO_CURSOR Cursor;

        //
        //  Bring up the change server name dialog
        //

	NLS_STR nlsServerName;
    	BOOL    fOK;

	if ( ( err = nlsServerName.QueryError() ) != NERR_Success )
	{
            ::MsgPopup( this, err );
	    return FALSE;
	}

	_sltServerName.QueryText( &nlsServerName ) ;

        CHANGE_SERVER_NAME_DLG *pDlg = new CHANGE_SERVER_NAME_DLG( 
					QueryHwnd(), 
					&nlsServerName );

    	if ( ( pDlg == NULL )
       		|| ((err = pDlg->QueryError()) != NERR_Success )
       		|| ((err = pDlg->Process( &fOK ))    != NERR_Success ) )
    	{
            err = err ? err : ERROR_NOT_ENOUGH_MEMORY;
        }

    	delete pDlg;

    	pDlg = NULL;

	if ( err != NO_ERROR )
	{
            ::MsgPopup( this, err );
	    return FALSE;
	}
        else
   	{
	    if ( fOK )
	    {
		_sltServerName.SetText( nlsServerName );

		_dwParmNum |= AFP_SERVER_PARMNUM_NAME;

        	::MsgPopup( this, IDS_SERVERNAME_CHANGE, MPSEV_WARNING, MP_OK );
	    }
	}
	
    }

    return DIALOG_WINDOW::OnCommand( event );

}

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

    NAME:	SERVER_PARAMETERS_DIALOG::OnOK	

    SYNOPSIS:   Validate all the information and create the volume.

    ENTRY:

    EXIT:

    RETURNS:

    NOTES:

    HISTORY:
	NarenG		12/15/92		Created

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

BOOL SERVER_PARAMETERS_DIALOG :: OnOK( VOID )
{
    APIERR err;

    //
    //  Just to be cool...
    //

    AUTO_CURSOR Cursor;

    AFP_SERVER_INFO AfpServerInfo;

    NLS_STR nlsServerName;

    if ( ( err = nlsServerName.QueryError() ) != NERR_Success )
    {
 	::MsgPopup( this, err );

        Dismiss(FALSE) ;

    	return(FALSE);
    }

    //
    // Set the server name
    //

    _sltServerName.QueryText( &nlsServerName );

    AfpServerInfo.afpsrv_name = (LPWSTR)(nlsServerName.QueryPch());

    //
    // Get the logon message 
    //
 
    UINT cb = _mleTextMsg.QueryTextSize();

    NLS_STR nlsMsgText( cb );

    //
    // Was there any text ?
    //

    if ( cb <= sizeof(TCHAR) )    // always has a terminating NULL
    {
   	AfpServerInfo.afpsrv_login_msg = NULL;

    }
    else
    {

    	if ( (( err = nlsMsgText.QueryError() ) != NERR_Success ) ||
    	     (( err = _mleTextMsg.QueryText(&nlsMsgText))!= NERR_Success ))
        {
            ::MsgPopup( this, err );

            Dismiss(FALSE) ;

    	    return(TRUE);
    	}

	if ( nlsMsgText.QueryTextLength() > AFP_MESSAGE_LEN )
	{
	    ::MsgPopup( this, IDS_MESSAGE_TOO_LONG );

    	    _mleTextMsg.ClaimFocus();
    	    _mleTextMsg.SelectString();

    	    return(FALSE);
	}

        AfpServerInfo.afpsrv_login_msg = (LPWSTR)(nlsMsgText.QueryPch());
    }

  
    //
    // Set the server options if the user changed it
    //


    AfpServerInfo.afpsrv_options =  _chkAllowPasswordSaves.QueryCheck()
				    ? AFP_SRVROPT_ALLOWSAVEDPASSWORD
				    : 0;

    AfpServerInfo.afpsrv_options |= _chkAllowGuestLogons.QueryCheck()
		     		    ? AFP_SRVROPT_GUESTLOGONALLOWED
				    : 0;

    AfpServerInfo.afpsrv_options |= _chkAllowClearTextPasswords.QueryCheck()
				    ? 0 : AFP_SRVROPT_CLEARTEXTLOGONALLOWED;


    AfpServerInfo.afpsrv_max_sessions = QuerySessionLimit();

    //
    //  Set this information
    //

    _dwParmNum |= ( AFP_SERVER_PARMNUM_LOGINMSG |
        	    AFP_SERVER_PARMNUM_OPTIONS  |
		    AFP_SERVER_PARMNUM_MAX_SESSIONS );

    err = ::AfpAdminServerSetInfo( _hServer,  
				    (LPBYTE)&AfpServerInfo, 
				   _dwParmNum );

    if ( err == NO_ERROR )
    {
        Dismiss( TRUE );
    }
    else
    {
        ::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
    }

    return TRUE;
}


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

    NAME:	SERVER_PARAMETERS_DIALOG::QuerySessionLimit

    SYNOPSIS:   Get the user limit from the magic group

    ENTRY:

    EXIT:

    RETURNS:    The user limit stored in the user limit magic group

    NOTES:

    HISTORY:
	NarenG		12/15/92		Created

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

DWORD SERVER_PARAMETERS_DIALOG::QuerySessionLimit( VOID ) const
{

    switch ( _mgrpSessionLimit.QuerySelection() )
    {

    case IDSP_RB_UNLIMITED:

    	return( AFP_MAXSESSIONS );

    case IDSP_RB_SESSIONS:

        return( _spsleSessions.QueryValue() );

    default:

	//	
	// Should never get here but in case we do, return unlimited
	//

        return( AFP_MAXSESSIONS );
    }

}

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

    NAME:	SERVER_PARAMETERS_DIALOG::SetSessionLimit	

    SYNOPSIS:   Sets the user limit on the magic group

    ENTRY:      dwSessionLimit - maximum number of users allowed

    EXIT:

    RETURNS:   

    NOTES:

    HISTORY:
	NarenG		12/15/92		Created

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

VOID SERVER_PARAMETERS_DIALOG::SetSessionLimit( DWORD dwSessionLimit )
{

     if ( dwSessionLimit == AFP_MAXSESSIONS )
     {
         //
         // Set selection to the  Unlimited button
         //

         _mgrpSessionLimit.SetSelection( IDSP_RB_UNLIMITED );

     }
     else 
     {
	//
        // Set the sessions button to the value
	//
	
        _mgrpSessionLimit.SetSelection( IDSP_RB_SESSIONS );

        _spsleSessions.SetValue( dwSessionLimit );

        _spsleSessions.Update();

     }

}

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

    NAME:	SERVER_PARAMETERS_DIALOG::QueryHelpContext	

    SYNOPSIS:   Query the help context of the dialog

    ENTRY:

    EXIT:

    RETURNS:    Return the help context of the dialog

    NOTES:

    HISTORY:
	NarenG		12/15/92		Created

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

ULONG SERVER_PARAMETERS_DIALOG::QueryHelpContext( VOID )
{
    return HC_SERVER_PARAMETERS_DIALOG;
}