523 lines
12 KiB
C++
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);
|
||
|
}
|
||
|
|