windows-nt/Source/XPSP1/NT/net/sfm/afp/ui/afpmgr/senddlg.cxx
2020-09-26 16:20:57 +08:00

523 lines
12 KiB
C++

/**********************************************************************/
/** 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);
}