|
|
//============================================================================
// 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; }
|