windows-nt/Source/XPSP1/NT/net/mmc/mprsnap/msgdlg.cpp

455 lines
9.5 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
//============================================================================
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: msgdlg.cpp
//
// History:
// 10/23/96 Abolade Gbadegesin Created.
//
// Implementation of the "Send Message" dialogs.
//============================================================================
#include "stdafx.h"
#include "dialog.h"
#include "rtrstr.h"
extern "C" {
//nclude "dim.h"
//nclude "ras.h"
//nclude "lm.h"
}
#include "msgdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//----------------------------------------------------------------------------
// Class: CMessageDlg
//
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Function: CMessageDlg::CMessageDlg
//
// Constructor.
//----------------------------------------------------------------------------
CMessageDlg::CMessageDlg(
LPCTSTR pszServerName,
LPCTSTR pszUserName,
LPCTSTR pszComputer,
HANDLE hConnection,
CWnd* pParent
) : CBaseDialog(IDD_DDM_MESSAGE, pParent),
m_fUser(TRUE),
m_sServerName(pszServerName ? pszServerName : c_szEmpty),
m_sUserName(pszUserName ? pszUserName : c_szEmpty),
m_sTarget(pszComputer ? pszComputer : c_szEmpty),
m_hConnection(hConnection)
{
}
CMessageDlg::CMessageDlg(
LPCTSTR pszServerName,
LPCTSTR pszTarget,
CWnd* pParent
) : CBaseDialog(IDD_DDM_MESSAGE, pParent),
m_fUser(FALSE),
m_sServerName(pszServerName ? pszServerName: c_szEmpty),
m_sUserName(c_szEmpty),
m_sTarget(pszTarget ? pszTarget : c_szEmpty)
{
}
//----------------------------------------------------------------------------
// Function: CMessageDlg::DoDataExchange
//
// DDX handler.
//----------------------------------------------------------------------------
VOID
CMessageDlg::DoDataExchange(
CDataExchange* pDX
) {
CBaseDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CMessageDlg, CBaseDialog)
END_MESSAGE_MAP()
DWORD CMessageDlg::m_dwHelpMap[] =
{
// IDC_DM_TO, HIDC_DM_TO,
// IDC_DM_MESSAGE, HIDC_DM_MESSAGE,
0,0
};
//----------------------------------------------------------------------------
// Function: CMessageDlg::OnInitDialog
//
// Performs dialog initialization.
//----------------------------------------------------------------------------
BOOL
CMessageDlg::OnInitDialog(
) {
CBaseDialog::OnInitDialog();
//
// Set the 'To' text to indicate who the message is going to
//
CString sText;
if (m_fUser) {
//
// We're sending to a client
//
AfxFormatString2(sText, IDS_DM_TO_USER_FORMAT, m_sUserName, m_sTarget);
}
else {
CString stTarget;
// Windows NT Bug : 285468
// Need to adjust for the local machine case. (if we are
// a local machine, then we will get a NULL name).
stTarget = m_sTarget;
if (stTarget.IsEmpty())
{
stTarget.LoadString(IDS_DM_LOCAL_MACHINE);
}
//
// We're sending to all RAS users in a domain or server
//
AfxFormatString1(
sText, IDS_DM_TO_SERVER_FORMAT,
stTarget
);
}
SetDlgItemText(IDC_DM_EDIT_TO, sText);
return FALSE;
}
//----------------------------------------------------------------------------
// Function: CMessageDlg::OnOK
//
//----------------------------------------------------------------------------
VOID
CMessageDlg::OnOK(
) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString sText;
DWORD err = ERROR_SUCCESS;
SPMprServerHandle sphMprServer;
USES_CONVERSION;
GetDlgItemText(IDC_DM_EDIT_MESSAGE, sText);
if (!sText.GetLength() &&
AfxMessageBox(IDS_ERR_NO_TEXT, MB_YESNO|MB_ICONQUESTION) != IDYES)
{
return;
}
if (m_fUser)
{
CWaitCursor wait;
// Need to get a connection to the server (to get the server handle)
err = ::MprAdminServerConnect(T2W((LPTSTR)(LPCTSTR)m_sServerName),
&sphMprServer);
if (err == ERROR_SUCCESS)
err = SendToClient(m_sServerName,
m_sTarget,
sphMprServer,
m_hConnection,
sText);
sphMprServer.Release();
}
else
{
err = SendToServer(m_sServerName, sText);
}
if (err == NERR_Success)
{
CBaseDialog::OnOK();
}
}
/*!--------------------------------------------------------------------------
CMessageDlg::SendToServer
-
Author: KennT
---------------------------------------------------------------------------*/
DWORD
CMessageDlg::SendToServer(
LPCTSTR pszServer,
LPCTSTR pszText,
BOOL* pbCancel
) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
DWORD dwErr = ERROR_SUCCESS;
CString sText;
TCHAR szServer[MAX_COMPUTERNAME_LENGTH+3];
DWORD i, dwTotal = 0, rc0Count = 0;
RAS_CONNECTION_0 *rc0Table = NULL, *prc0;
WCHAR wszServer[MAX_COMPUTERNAME_LENGTH+3];
HRESULT hr = hrOK;
SPMprServerHandle sphMprServer;
SPMprAdminBuffer spMprBuffer;
Assert(pszServer);
Assert(pszText);
COM_PROTECT_TRY
{
StrCpy(szServer, pszServer);
StrCpyWFromT(wszServer, pszServer);
//
// See if the router is installed on the machine;
//
if (!::MprAdminIsServiceRunning(wszServer))
{
goto Error;
}
//
// Connect to the server
//
{
CWaitCursor wait;
dwErr = ::MprAdminServerConnect(wszServer, &sphMprServer);
}
if (dwErr != NO_ERROR) {
TCHAR szText[2048];
FormatSystemError(HRESULT_FROM_WIN32(dwErr),
szText, DimensionOf(szText), 0,
FSEFLAG_ANYMESSAGE);
AfxFormatString2(sText, IDS_ERR_CONNECT_ERROR, szServer, szText);
AfxMessageBox(sText, MB_OK|MB_ICONINFORMATION);
goto Error;
}
//
// Retrieve an array of the connections on the server
//
{
CWaitCursor wait;
rc0Table = NULL;
dwErr = ::MprAdminConnectionEnum(
sphMprServer,
0,
(BYTE**)&spMprBuffer,
(DWORD)-1,
&rc0Count,
&dwTotal,
NULL
);
rc0Table = (RAS_CONNECTION_0 *) (BYTE *) spMprBuffer;
}
if (dwErr != NO_ERROR) {
TCHAR szText[2048];
FormatSystemError(HRESULT_FROM_WIN32(dwErr),
szText, DimensionOf(szText), 0,
FSEFLAG_ANYMESSAGE);
AfxFormatString2(sText, IDS_ERR_CONNENUM_ERROR, szServer, szText);
AfxMessageBox(sText, MB_OK|MB_ICONINFORMATION);
goto Error;
}
//
// For each one which is a client with RAS_FLAGS_MESSENGER_PRESENT,
// send the message
//
for (i = 0; i < rc0Count; i++)
{
prc0 = rc0Table + i;
if (prc0->dwInterfaceType != ROUTER_IF_TYPE_CLIENT ||
!lstrlenW(prc0->wszRemoteComputer) ||
!(prc0->dwConnectionFlags & RAS_FLAGS_MESSENGER_PRESENT)){
continue;
}
dwErr = SendToClient(pszServer,
prc0->wszRemoteComputer,
sphMprServer,
prc0->hConnection,
pszText);
if (!dwErr) { continue; }
AfxFormatString1(sText, IDS_PROMPT_SERVER_CONTINUE, szServer);
if (AfxMessageBox(sText, MB_YESNO|MB_ICONQUESTION) == IDNO)
{
if (pbCancel) { *pbCancel = TRUE; }
break;
}
}
COM_PROTECT_ERROR_LABEL;
}
COM_PROTECT_CATCH;
if ((dwErr == ERROR_SUCCESS) && !FHrSucceeded(hr))
{
// Assume that the failure was an out of memory
dwErr = ERROR_OUTOFMEMORY;
}
sphMprServer.Release();
return dwErr;
}
/*!--------------------------------------------------------------------------
CMessageDlg::SendToClient
-
Author: KennT
---------------------------------------------------------------------------*/
DWORD CMessageDlg::SendToClient(LPCTSTR pszServerName,
LPCTSTR pszTarget,
MPR_SERVER_HANDLE hMprServer,
HANDLE hConnection,
LPCTSTR pszText)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
WCHAR *pswzText = NULL;
CString sText;
DWORD dwErr;
HKEY hkMachine = NULL;
HRESULT hr = hrOK;
RouterVersionInfo verInfo;
USES_CONVERSION;
Assert(pszTarget);
Assert(pszServerName);
Assert(hMprServer);
Assert(hConnection);
COM_PROTECT_TRY
{
// Windows NT Bug : 158746
// Note, if the target machine is NT5, then we can use the
// new APIs
// ------------------------------------------------------------
// setup a default of NT5
// ------------------------------------------------------------
verInfo.dwRouterVersion = 5;
dwErr = ConnectRegistry(pszServerName, &hkMachine);
hr = HRESULT_FROM_WIN32(dwErr);
if (FHrSucceeded(hr) && hkMachine)
{
QueryRouterVersionInfo(hkMachine, &verInfo);
DisconnectRegistry(hkMachine);
}
// For NT4, call the old NetMessageBufferSend
// ------------------------------------------------------------
if (verInfo.dwRouterVersion == 4)
{
CWaitCursor wait;
pswzText = StrDupWFromT(pszText);
dwErr = ::NetMessageBufferSend(
NULL,
T2W((LPTSTR) pszTarget),
NULL,
(BYTE *) pswzText,
CbStrLenW(pswzText));
}
else
{
// For NT5 and up, Use the MprAdminXXX api. This will
// work correctly for the Appletalk case
// --------------------------------------------------------
CWaitCursor wait;
dwErr = ::MprAdminSendUserMessage(hMprServer,
hConnection,
T2W((LPTSTR) pszText));
}
if (dwErr != ERROR_SUCCESS)
{
TCHAR szText[2048];
FormatSystemError(HRESULT_FROM_WIN32(dwErr),
szText, DimensionOf(szText), 0,
FSEFLAG_ANYMESSAGE);
AfxFormatString2(sText, IDS_ERR_SEND_FAILED, pszTarget, szText);
AfxMessageBox(sText, MB_OK|MB_ICONINFORMATION);
}
}
COM_PROTECT_CATCH;
delete pswzText;
if ((dwErr == ERROR_SUCCESS) && !FHrSucceeded(hr))
{
dwErr = ERROR_OUTOFMEMORY;
}
return dwErr;
}