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

/*
    sendmsg.cxx

    This file contains the SEND_MSG_USER_DIALOG class definition viz.
    used to send a message from the users dialog and 
    SEND_MSG_SERVER_DIALOG viz used to send a message to all the users
    connected with the server.

    The 2 dialogs SEND_MSG_USER_DIALOG and SEND_MSG_SERVER_DIALOG are
    very similar and can easily be subclassed. The amount of code saved
    would be minimal if anything at all. Therefore this hs not been done.
    

    FILE HISTORY:
	NarenG		16-Oct-1992  	Folded MSG_DIALOG_BASE and
					SEND_MESSAGE_DIALOG into one.
					

*/

extern "C"
{
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
}

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

#define INCL_BLT_DIALOG
#define INCL_BLT_CONTROL
#define INCL_BLT_MSGPOPUP
#include <blt.hxx>

#if defined(DEBUG)
static const CHAR szFileName[] = __FILE__;
#define _FILENAME_DEFINED_ONCE szFileName
#endif  // DEBUG

#include <uiassert.hxx>

extern "C"
{

#include <afpmgr.h>
#include <macfile.h>

}

#include <string.hxx>
#include <senddlg.hxx>


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

    NAME:       SEND_MSG_USER_DIALOG::SEND_MSG_USER_DIALOG

    SYNOPSIS:   Constructor for AFP Manager Send Message Dialog

    ENTRY:      Expects valid HWND for hDlg 
    		Must have server and user selection

    EXIT:       Usual construction stuff, slt set to contain
                server of current focus.

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

SEND_MSG_USER_DIALOG::SEND_MSG_USER_DIALOG( 
					  HWND       	       hWndOwner,
                                    	  AFP_SERVER_HANDLE    hServer,
				    	  const TCHAR *	       pszServerName, 
				    	  const TCHAR *	       pszUserName, 
					  DWORD		       dwSessionId )
  : DIALOG_WINDOW( MAKEINTRESOURCE( IDD_SEND_MSG_USER_DIALOG ), hWndOwner ),
     _sltServerName( this, IDSM_DT_SERVER_NAME ),
     _sltUserName( this, IDSM_DT_USER_NAME ),
     _rgRecipients( this, IDSM_RB_SINGLE_USER, 2, IDSM_RB_SINGLE_USER ),
     _mleTextMsg( this, IDSM_ET_MESSAGE, AFP_MESSAGE_LEN  ),
     _hServer( hServer ),
     _dwSessionId( dwSessionId )
{

    // 
    // Did everything construct properly ?
    // 

    if ( QueryError() != NERR_Success )
        return;

    APIERR err;

    if ( (( err = _sltServerName.QueryError() ) != NERR_Success ) ||
    	 (( err = _sltUserName.QueryError() )   != NERR_Success ) ||
    	 (( err = _rgRecipients.QueryError() )  != NERR_Success ) ||
    	 (( err = _mleTextMsg.QueryError() )    != NERR_Success ) )
    {
	ReportError( err );
  	return;
    }
	
    //
    // Must have a users and server selection
    //

    UIASSERT(pszServerName != NULL) ;
    UIASSERT(pszUserName != NULL) ;

    //
    //	Set the server name after removing the backslashes
    //

    ALIAS_STR nlsServerName( pszServerName );
    UIASSERT( nlsServerName.QueryError() == NERR_Success );

    ISTR istr( nlsServerName );

    //
    //  Skip the backslashes.
    //

    istr += 2;

    ALIAS_STR nlsWithoutPrefix( nlsServerName.QueryPch( istr ) );
    UIASSERT( nlsWithoutPrefix.QueryError() == NERR_Success );

    _sltServerName.SetText( nlsWithoutPrefix );
    _sltServerName.Enable( TRUE );


    // 
    //  Set the selected user's name
    //

    _sltUserName.SetText( pszUserName );
    _sltUserName.Enable( TRUE );

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

    _mleTextMsg.SetFmtLines(FALSE);

}

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

    NAME:       SEND_MSG_USER_DIALOG::~SEND_MSG_USER_DIALOG

    SYNOPSIS:   this destructor does nothing

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

SEND_MSG_USER_DIALOG::~SEND_MSG_USER_DIALOG()
{

    //
    // This space intentionally left blank
    //
}

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

    NAME:       SEND_MSG_USER_DIALOG::QueryHelpContext

    SYNOPSIS:   Query help text for SEND_MSG_USER_DIALOG

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

ULONG SEND_MSG_USER_DIALOG::QueryHelpContext( void )
{
    return HC_SEND_MSG_USER_DIALOG;
}

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

    NAME:       SEND_MSG_USER_DIALOG::OnOK

    SYNOPSIS:   Replaces the OnOK in DIALOG_WINDOW. It gets the 
	 	text from the MLE and sends it.

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

BOOL SEND_MSG_USER_DIALOG::OnOK()
{

    //
    // Set cursor to hour glass.
    //

    AUTO_CURSOR 	AutoCursor;

    AFP_MESSAGE_INFO 	AfpMsg;

    // 
    // Find out whom to send the message to.
    //

    AfpMsg.afpmsg_session_id = 
			( _rgRecipients.QuerySelection() == IDSM_RB_ALL_USERS )
		        ? 0 : _dwSessionId;

    //
    // Attempt to send the message
    //

    UINT cb = _mleTextMsg.QueryTextSize();

    //
    // Was there any text ?
    //

    if ( cb <= sizeof(TCHAR) )    // always has a terminating NULL
    {
        ::MsgPopup( this, IDS_NEED_TEXT_TO_SEND );

    	_mleTextMsg.ClaimFocus();

    	return(TRUE);
    }

    NLS_STR nlsMsgText( cb );
    APIERR  err;

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

    	return(FALSE);
    }
  
//	MSKK HitoshiT modified to handle DBCS	94/09/01
#ifdef	DBCS
    UNICODE_STRING unistr;
    unistr.Length = nlsMsgText.QueryTextLength() * sizeof(WCHAR) ;
    unistr.MaximumLength = unistr.Length ;
    unistr.Buffer = (WCHAR *)nlsMsgText.QueryPch() ;
    if ( RtlUnicodeStringToOemSize( &unistr ) > AFP_MESSAGE_LEN )
#else
    if ( nlsMsgText.QueryTextLength() > AFP_MESSAGE_LEN )
#endif
    {
	::MsgPopup( this, IDS_MESSAGE_TOO_LONG );

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

    	return(FALSE);
    }

    AfpMsg.afpmsg_text = (LPWSTR)(nlsMsgText.QueryPch());

    err = AfpAdminMessageSend( _hServer, &AfpMsg );

    switch( err )
    {
    case AFPERR_InvalidId:
    	::MsgPopup( this, IDS_SESSION_DELETED );
        Dismiss( FALSE );
  	break;

    case NO_ERROR:
        ::MsgPopup( this, IDS_MESSAGE_SENT, MPSEV_INFO );
        Dismiss( TRUE );
	break;
  
    case AFPERR_InvalidSessionType:

	if ( _rgRecipients.QuerySelection() == IDSM_RB_ALL_USERS )  
    	    ::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
	else
    	    ::MsgPopup( this, IDS_NOT_RECEIVED  );

        Dismiss( FALSE );
	break;

    default:
        ::MsgPopup( this, AFPERR_TO_STRINGID( err ) );
        Dismiss( FALSE );
	break;
    }

    return(TRUE);
}


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

    NAME:       SEND_MSG_SERVER_DIALOG::SEND_MSG_SERVER_DIALOG

    SYNOPSIS:   Constructor for AFP Manager Send Message Dialog

    ENTRY:      Expects valid HWND for hDlg 
    		Must have server selection

    EXIT:       Usual construction stuff, slt set to contain
                server of current focus.

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

SEND_MSG_SERVER_DIALOG::SEND_MSG_SERVER_DIALOG( 
					  HWND       	       hWndOwner,
                                    	  AFP_SERVER_HANDLE    hServer,
				    	  const TCHAR *	       pszServerName )
  : DIALOG_WINDOW( MAKEINTRESOURCE( IDD_SEND_MSG_SERVER_DIALOG ), hWndOwner ),
     _sltServerName( this, IDSD_DT_SERVER_NAME ),
     _mleTextMsg( this, IDSD_ET_MESSAGE, AFP_MESSAGE_LEN  ),
     _hServer( hServer )
{

    // 
    // Did everything construct properly ?
    // 

    if ( QueryError() != NERR_Success )
        return;

    APIERR err;

    if ( (( err = _sltServerName.QueryError() ) != NERR_Success ) ||
    	 (( err = _mleTextMsg.QueryError() )    != NERR_Success ) )
    {
	ReportError( err );
  	return;
    }
	
    //
    // Must have a users and server selection
    //

    UIASSERT(pszServerName != NULL) ;

    //
    //	Set the server name after removing the backslashes
    //

    ALIAS_STR nlsServerName( pszServerName );
    UIASSERT( nlsServerName.QueryError() == NERR_Success );

    ISTR istr( nlsServerName );

    //
    //  Skip the backslashes.
    //

    istr += 2;

    ALIAS_STR nlsWithoutPrefix( nlsServerName.QueryPch( istr ) );
    UIASSERT( nlsWithoutPrefix.QueryError() == NERR_Success );

    _sltServerName.SetText( nlsWithoutPrefix );
    _sltServerName.Enable( TRUE );

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

    _mleTextMsg.SetFmtLines(FALSE);

}

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

    NAME:       SEND_MSG_SERVER_DIALOG::~SEND_MSG_SERVER_DIALOG

    SYNOPSIS:   this destructor does nothing

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

SEND_MSG_SERVER_DIALOG::~SEND_MSG_SERVER_DIALOG()
{

    //
    // This space intentionally left blank
    //
}

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

    NAME:       SEND_MSG_SERVER_DIALOG::QueryHelpContext

    SYNOPSIS:   Query help text for SEND_MSG_SERVER_DIALOG

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

ULONG SEND_MSG_SERVER_DIALOG::QueryHelpContext( void )
{
    return HC_SEND_MSG_SERVER_DIALOG;
}

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

    NAME:       SEND_MSG_SERVER_DIALOG::OnOK

    SYNOPSIS:   Replaces the OnOK in DIALOG_WINDOW. It gets the 
	 	text from the MLE and sends it.

    HISTORY:
	NarenG		16-Oct-1992  	Created

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

BOOL SEND_MSG_SERVER_DIALOG::OnOK()
{

    //
    // Set cursor to hour glass.
    //

    AUTO_CURSOR 	AutoCursor;

    AFP_MESSAGE_INFO 	AfpMsg;

    // 
    // Send a message to all the users.
    //

    AfpMsg.afpmsg_session_id = 0;

    //
    // Attempt to send the message
    //

    UINT cb = _mleTextMsg.QueryTextSize();

    //
    // Was there any text ?
    //

    if ( cb <= sizeof(TCHAR) )    // always has a terminating NULL
    {
        ::MsgPopup( this, IDS_NEED_TEXT_TO_SEND );

    	_mleTextMsg.ClaimFocus();

    	return(FALSE);
    }

    NLS_STR nlsMsgText( cb );
    APIERR  err;

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

    	return(FALSE);
    }

//	MSKK HitoshiT modified to handle DBCS	94/09/01
#ifdef	DBCS
    UNICODE_STRING unistr;
    unistr.Length = nlsMsgText.QueryTextLength() * sizeof(WCHAR) ;
    unistr.MaximumLength = unistr.Length ;
    unistr.Buffer = (WCHAR *)nlsMsgText.QueryPch() ;
    if ( RtlUnicodeStringToOemSize( &unistr ) > AFP_MESSAGE_LEN )
#else
    if ( nlsMsgText.QueryTextLength() > AFP_MESSAGE_LEN )
#endif
    {
	::MsgPopup( this, IDS_MESSAGE_TOO_LONG );

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

    	return(FALSE);
    }
  
    AfpMsg.afpmsg_text = (LPWSTR)(nlsMsgText.QueryPch());

    DWORD error = AfpAdminMessageSend( _hServer, &AfpMsg );

    if ( error != NO_ERROR )
    {
        ::MsgPopup( this, AFPERR_TO_STRINGID(error) );

        Dismiss( FALSE );
    }
    else
    {
        ::MsgPopup( this, IDS_MESSAGE_SENT, MPSEV_INFO );

        Dismiss( TRUE );
    }

    return(TRUE);
}