windows-nt/Source/XPSP1/NT/net/mmc/ipxsnap/sumprop.cpp
2020-09-26 16:20:57 +08:00

1181 lines
30 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
sumprop.cpp
IPX summary node property sheet and property pages
FILE HISTORY:
*/
#include "stdafx.h"
#include "rtrutil.h" // smart MPR handle pointers
#include "format.h" // FormatNumber function
#include "sumprop.h"
#include "summary.h"
#include "ipxrtdef.h"
#include "mprerror.h"
#include "mprfltr.h"
#include "rtrerr.h"
#include "remras.h"
#include "rrasutil.h"
#include "ipxutil.h"
#include "rtrcomn.h"
extern "C"
{
#include "routprot.h"
};
IPXSummaryInterfaceProperties::IPXSummaryInterfaceProperties(ITFSNode *pNode,
IComponentData *pComponentData,
ITFSComponentData *pTFSCompData,
LPCTSTR pszSheetName,
CWnd *pParent,
UINT iPage,
BOOL fScopePane)
: RtrPropertySheet(pNode, pComponentData, pTFSCompData,
pszSheetName, pParent, iPage, fScopePane),
m_pageConfig(IDD_IPX_IF_CONFIG_PAGE),
m_pageGeneral(IDD_IPX_IF_GENERAL_PAGE),
m_bNewInterface(FALSE),
m_pIPXConn(NULL)
{
m_spNode.Set(pNode);
}
/*!--------------------------------------------------------------------------
IPXSummaryInterfaceProperties::Init
Initialize the property sheets. The general action here will be
to initialize/add the various pages.
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryInterfaceProperties::Init(IRtrMgrInfo *pRm,
IInterfaceInfo *pIfInfo)
{
HRESULT hr = hrOK;
IPXConnection * pIPXConn;
BaseIPXResultNodeData * pData;
SPIRouterInfo spRouter;
RouterVersionInfo routerVersion;
pData = GET_BASEIPXRESULT_NODEDATA(m_spNode);
ASSERT_BASEIPXRESULT_NODEDATA(pData);
pIPXConn = pData->m_pIPXConnection;
m_spRm.Set(pRm);
m_spIf.Set(pIfInfo);
m_spRm->GetParentRouterInfo(&spRouter);
// The pages are embedded members of the class
// do not delete them.
m_bAutoDeletePages = FALSE;
// Initialize the infobase
// Do this here, because the init is called in the context
// of the main thread
CORg( LoadInfoBase(pIPXConn) );
m_pageGeneral.Init(m_spIf, pIPXConn, this);
AddPageToList((CPropertyPageBase*) &m_pageGeneral);
// Windows NT Bug : 208724
// Only show the IPX configuration page for the internal interface
if (m_spIf && (m_spIf->GetInterfaceType() == ROUTER_IF_TYPE_INTERNAL))
{
// Only allow config page for NT5 and up (there is no
// configuration object for NT4).
spRouter->GetRouterVersionInfo(&routerVersion);
if (routerVersion.dwRouterVersion >= 5)
{
HRESULT hrPage;
hrPage = m_pageConfig.Init(m_spIf, pIPXConn, this);
if (FHrOK(hrPage))
AddPageToList((CPropertyPageBase*) &m_pageConfig);
else if (!FHrSucceeded(hrPage))
DisplayTFSErrorMessage(NULL);
}
}
Error:
return hr;
}
IPXSummaryInterfaceProperties::~IPXSummaryInterfaceProperties()
{
if (m_pIPXConn)
{
m_pIPXConn->Release();
m_pIPXConn = NULL;
}
}
/*!--------------------------------------------------------------------------
IPXSummaryInterfaceProperties::LoadInfoBase
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryInterfaceProperties::LoadInfoBase(IPXConnection *pIPXConn)
{
Assert(pIPXConn);
HRESULT hr = hrOK;
HANDLE hTransport = NULL;
LPCOLESTR pszInterfaceId = NULL;
SPIInfoBase spInfoBase;
BYTE * pDefault;
int cBlocks = 0;
m_pIPXConn = pIPXConn;
pIPXConn->AddRef();
// If configuring the client-interface, load the client-interface info,
// otherwise, retrieve the interface being configured and load
// its info.
// The client interface doesn't have an ID
if (m_spIf)
pszInterfaceId = m_spIf->GetId();
if ((pszInterfaceId == NULL) || (StrLenW(pszInterfaceId) == 0))
{
#ifdef DEBUG
// Check to see that this is really an client node
{
BaseIPXResultNodeData * pResultData = NULL;
pResultData = GET_BASEIPXRESULT_NODEDATA(m_spNode);
Assert(pResultData);
ASSERT_BASEIPXRESULT_NODEDATA(pResultData);
Assert(pResultData->m_fClient);
}
#endif
// Get the transport handle
CWRg( ::MprConfigTransportGetHandle(pIPXConn->GetConfigHandle(),
PID_IPX,
&hTransport) );
// Load the client interface info
CORg( m_spRm->GetInfoBase(pIPXConn->GetConfigHandle(),
hTransport,
NULL,
&spInfoBase) );
m_bClientInfoBase = TRUE;
}
else
{
m_spRmIf.Release();
CORg( m_spIf->FindRtrMgrInterface(PID_IPX,
&m_spRmIf) );
//
//$ Opt: This should be made into a sync call rather
// than a Load.
//
// Reload the information for this router-manager interface
// This call could fail for valid reasons (if we are creating
// a new interface, for example).
//
m_spRmIf->Load(m_spIf->GetMachineName(), NULL, NULL, NULL);
//
// The parameters are all NULL so that we can use the
// default RPC handles.
//
m_spRmIf->GetInfoBase(NULL, NULL, NULL, &spInfoBase);
m_bClientInfoBase = FALSE;
}
if (!spInfoBase)
{
// No info was found for the inteface
// allocate a new InfoBase instead
CORg( CreateInfoBase(&spInfoBase) );
}
//
// Check that there is a block for interface-status in the info,
// and insert the default block if none is found.
//
if (spInfoBase->BlockExists(IPX_INTERFACE_INFO_TYPE) == hrFalse)
{
// If it didn't have the general interface info, assume that
// we're adding IPX to this interface
m_bNewInterface = TRUE;
}
CORg( AddIpxPerInterfaceBlocks(m_spIf, spInfoBase) );
m_spInfoBase = spInfoBase.Transfer();
Error:
return hr;
}
/*!--------------------------------------------------------------------------
IPXSummaryInterfaceProperties::GetInfoBase
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryInterfaceProperties::GetInfoBase(IInfoBase **ppInfoBase)
{
Assert(ppInfoBase);
*ppInfoBase = m_spInfoBase;
m_spInfoBase->AddRef();
return hrOK;
}
/*!--------------------------------------------------------------------------
IPXSummaryInterfaceProperties::SaveSheetData
This is performed on the main thread. This will save sheet-wide
data (rather than page data).
Author: KennT
---------------------------------------------------------------------------*/
BOOL IPXSummaryInterfaceProperties::SaveSheetData()
{
HRESULT hr = hrOK;
SPITFSNodeHandler spHandler;
HANDLE hTransport = NULL, hInterface = NULL;
DWORD dwErr;
SPITFSNode spParent;
// By this time each page should have written its information out
// to the infobase
if (m_spInfoBase)
{
if (m_bClientInfoBase)
{
Assert(m_spRm);
CORg( m_spRm->Save(m_spRm->GetMachineName(), 0, 0, NULL,
m_spInfoBase, 0));
}
else
{
// For IPX, we need to have the protocol information in the
// infobase, BEFORE we add the interface to the running router.
Assert(m_spRmIf);
//
// Need to set the infobase back to the registry
//
m_pIPXConn->DisconnectFromConfigServer();
CWRg( ::MprConfigInterfaceGetHandle(
m_pIPXConn->GetConfigHandle(),
(LPTSTR) m_spRmIf->GetInterfaceId(),
&hInterface) );
// Get the transport handle
dwErr = ::MprConfigInterfaceTransportGetHandle(
m_pIPXConn->GetConfigHandle(),
hInterface,// need hInterface
PID_IPX,
&hTransport);
if (dwErr != ERROR_SUCCESS)
{
RtrMgrInterfaceCB rmIfCB;
m_spRmIf->CopyCB(&rmIfCB);
dwErr = ::MprConfigInterfaceTransportAdd(
m_pIPXConn->GetConfigHandle(),
hInterface,
m_spRmIf->GetTransportId(),
rmIfCB.szId,
NULL, 0, &hTransport);
}
CWRg( dwErr );
m_spRmIf->SetInfoBase(NULL, hInterface, hTransport, m_spInfoBase);
//
// Now, we notify that the interface is being added
// This gives the protocols a chance to add on their information
//
if (m_bNewInterface)
m_spRm->RtrNotify(ROUTER_CHILD_PREADD, ROUTER_OBJ_RmIf, 0);
//
// Reload the infobase (to get the new data before calling
// the final save).
//
m_spInfoBase.Release();
m_spRmIf->GetInfoBase(NULL, hInterface, hTransport, &m_spInfoBase);
//
// Perform the final save (since we are passing in a non-NULL
// infobase pointer) this will commit the information back
// to the running router.
//
CORg( m_spRmIf->Save(m_spIf->GetMachineName(),
NULL, hInterface, hTransport, m_spInfoBase, 0));
}
if (m_bNewInterface)
m_spRm->RtrNotify(ROUTER_CHILD_ADD, ROUTER_OBJ_RmIf, 0);
}
if (m_bNewInterface)
{
SPITFSNodeHandler spHandler;
SPITFSNode spParent;
m_spNode->SetVisibilityState(TFS_VIS_SHOW);
m_spNode->Show();
// Force the node to do a resync
m_spNode->GetParent(&spParent);
spParent->GetHandler(&spHandler);
spHandler->OnCommand(spParent, IDS_MENU_SYNC, CCT_RESULT,
NULL, 0);
// Windows NT Bugs : 133891, we have added this to the UI
// we no longer consider this a new interface
m_bNewInterface = FALSE;
}
Error:
if (!FHrSucceeded(hr))
{
// Panic1("The Save failed %08lx", hr);
CancelSheetData();
return FALSE;
}
// Force the node to do a resync
m_spNode->GetParent(&spParent);
spParent->GetHandler(&spHandler);
spHandler->OnCommand(spParent, IDS_MENU_SYNC, CCT_RESULT,
NULL, 0);
return TRUE;
}
/*!--------------------------------------------------------------------------
IPXSummaryInterfaceProperties::CancelSheetData
-
Author: KennT
---------------------------------------------------------------------------*/
void IPXSummaryInterfaceProperties::CancelSheetData()
{
if (m_bNewInterface)
{
m_spNode->SetVisibilityState(TFS_VIS_DELETE);
if (m_spIf)
m_spIf->DeleteRtrMgrInterface(PID_IPX, TRUE);
else
{
// This was the client interface, just don't save the
// infobase back
}
}
}
/*---------------------------------------------------------------------------
IPXSummaryIfPageGeneral
---------------------------------------------------------------------------*/
IPXSummaryIfPageGeneral::~IPXSummaryIfPageGeneral()
{
if (m_pIPXConn)
{
m_pIPXConn->Release();
m_pIPXConn = NULL;
}
}
BEGIN_MESSAGE_MAP(IPXSummaryIfPageGeneral, RtrPropertyPage)
//{{AFX_MSG_MAP(IPXSummaryIfPageGeneral)
ON_BN_CLICKED(IDC_IIG_BTN_INPUT_FILTERS, OnInputFilters)
ON_BN_CLICKED(IDC_IIG_BTN_OUTPUT_FILTERS, OnOutputFilters)
ON_BN_CLICKED(IDC_IIG_BTN_ADMIN_STATE, OnChangeAdminButton)
ON_BN_CLICKED(IDC_IIG_BTN_IPX_CP, OnChangeButton)
ON_BN_CLICKED(IDC_IIG_BTN_IPX_WAN, OnChangeButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void IPXSummaryIfPageGeneral::OnChangeAdminButton()
{
BOOL bSelected = IsDlgButtonChecked(IDC_IIG_BTN_ADMIN_STATE);
DWORD dwIfType = m_spIf ? m_spIf->GetInterfaceType() : ROUTER_IF_TYPE_CLIENT;
if (ROUTER_IF_TYPE_CLIENT != dwIfType)
{
GetDlgItem(IDC_IIG_BTN_INPUT_FILTERS)->EnableWindow(bSelected);
GetDlgItem(IDC_IIG_BTN_OUTPUT_FILTERS)->EnableWindow(bSelected);
}
// Only if dwIfType == ROUTER_IF_TYPE_FULL_ROUTER can IDC_IIG_BTN_IPX_CP || IDC_IIG_BTN_IPX_WAN be changed
if (ROUTER_IF_TYPE_FULL_ROUTER == dwIfType)
{
GetDlgItem(IDC_IIG_GRP_CONTROL_PROTOCOL)->EnableWindow(bSelected);
GetDlgItem(IDC_IIG_BTN_IPX_CP)->EnableWindow(bSelected);
GetDlgItem(IDC_IIG_BTN_IPX_WAN)->EnableWindow(bSelected);
}
OnChangeButton();
}
void IPXSummaryIfPageGeneral::OnChangeButton()
{
SetDirty(TRUE);
SetModified();
}
void IPXSummaryIfPageGeneral::OnInputFilters()
{
OnFiltersConfig(FILTER_INBOUND);
}
void IPXSummaryIfPageGeneral::OnOutputFilters()
{
OnFiltersConfig(FILTER_OUTBOUND);
}
/*!--------------------------------------------------------------------------
IPXSummaryIfPageGeneral::Init
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryIfPageGeneral::Init(IInterfaceInfo *pIfInfo,
IPXConnection *pIPXConn,
IPXSummaryInterfaceProperties *pPropSheet)
{
m_spIf.Set(pIfInfo);
m_pIPXConn = pIPXConn;
pIPXConn->AddRef();
m_pIPXPropSheet = pPropSheet;
return hrOK;
}
/*!--------------------------------------------------------------------------
IPXSummaryIfPageGeneral::OnInitDialog
-
Author: KennT
---------------------------------------------------------------------------*/
BOOL IPXSummaryIfPageGeneral::OnInitDialog()
{
HRESULT hr = hrOK;
PBYTE pData;
SPIInfoBase spInfoBase;
IPX_IF_INFO * pIpxIf = NULL;
IPXWAN_IF_INFO *pIpxWanIf = NULL;
DWORD dwIfType;
BOOL fEnable;
// create the error info object
CreateTFSErrorInfo(0);
RtrPropertyPage::OnInitDialog();
//
// The page is now initialized. Load the current configuration
// for the interface being configured, and display its settings.
//
// Get the infobase from the property sheet.
//
CORg( m_pIPXPropSheet->GetInfoBase(&spInfoBase) );
//
// Retrieve the interface-status block configured
//
CORg( spInfoBase->GetData(IPX_INTERFACE_INFO_TYPE, 0, (BYTE **) &pIpxIf) );
CheckDlgButton(IDC_IIG_BTN_ADMIN_STATE, pIpxIf->AdminState == ADMIN_STATE_ENABLED);
GetDlgItem(IDC_IIG_GRP_CONTROL_PROTOCOL)->EnableWindow(pIpxIf->AdminState == ADMIN_STATE_ENABLED);
GetDlgItem(IDC_IIG_BTN_INPUT_FILTERS)->EnableWindow(pIpxIf->AdminState == ADMIN_STATE_ENABLED);
GetDlgItem(IDC_IIG_BTN_OUTPUT_FILTERS)->EnableWindow(pIpxIf->AdminState == ADMIN_STATE_ENABLED);
dwIfType = m_spIf ? m_spIf->GetInterfaceType() : ROUTER_IF_TYPE_CLIENT;
if (dwIfType == ROUTER_IF_TYPE_FULL_ROUTER)
{
CORg( spInfoBase->GetData(IPXWAN_INTERFACE_INFO_TYPE, 0,
(LPBYTE *) &pIpxWanIf) );
if (pIpxWanIf->AdminState == ADMIN_STATE_ENABLED)
CheckDlgButton(IDC_IIG_BTN_IPX_WAN, ENABLED);
else
CheckDlgButton(IDC_IIG_BTN_IPX_CP, ENABLED);
fEnable = TRUE;
}
else if (dwIfType == ROUTER_IF_TYPE_CLIENT)
{
CheckDlgButton(IDC_IIG_BTN_IPX_CP, ENABLED);
fEnable = FALSE;
}
else
{
fEnable = FALSE;
}
// by default the controls are enabled, so do this call only
// if we need to disable them
if (fEnable == FALSE)
{
GetDlgItem(IDC_IIG_GRP_CONTROL_PROTOCOL)->EnableWindow(FALSE);
GetDlgItem(IDC_IIG_BTN_IPX_CP)->EnableWindow(FALSE);
GetDlgItem(IDC_IIG_BTN_IPX_WAN)->EnableWindow(FALSE);
}
if (dwIfType == ROUTER_IF_TYPE_CLIENT)
{
GetDlgItem(IDC_IIG_BTN_INPUT_FILTERS)->EnableWindow(FALSE);
GetDlgItem(IDC_IIG_BTN_OUTPUT_FILTERS)->EnableWindow(FALSE);
}
SetDirty(m_pIPXPropSheet->m_bNewInterface ? TRUE : FALSE);
Error:
if (!FHrSucceeded(hr))
Cancel();
return FHrSucceeded(hr) ? TRUE : FALSE;
}
/*!--------------------------------------------------------------------------
IPXSummaryIfPageGeneral::DoDataExchange
-
Author: KennT
---------------------------------------------------------------------------*/
void IPXSummaryIfPageGeneral::DoDataExchange(CDataExchange *pDX)
{
RtrPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(IPXSummaryIfPageGeneral)
//}}AFX_DATA_MAP
}
BOOL IPXSummaryIfPageGeneral::OnApply()
{
INT i;
SPIInfoBase spInfoBase;
IPX_IF_INFO * pIpxIf = NULL;
IPXWAN_IF_INFO *pIpxWanIf = NULL;
BOOL fReturn;
HRESULT hr = hrOK;
DWORD dwIfType;
if ( m_pIPXPropSheet->IsCancel() )
{
CancelApply();
return TRUE;
}
//
// Retrieve the interface-status block configured
//
m_pIPXPropSheet->GetInfoBase(&spInfoBase);
CORg( spInfoBase->GetData(IPX_INTERFACE_INFO_TYPE, 0, (BYTE **) &pIpxIf) );
pIpxIf->AdminState = IsDlgButtonChecked(IDC_IIG_BTN_ADMIN_STATE) ?
ADMIN_STATE_ENABLED : ADMIN_STATE_DISABLED;
dwIfType = m_spIf ? m_spIf->GetInterfaceType() : ROUTER_IF_TYPE_CLIENT;
if ((dwIfType == ROUTER_IF_TYPE_FULL_ROUTER) ||
(dwIfType == ROUTER_IF_TYPE_CLIENT))
{
CORg( spInfoBase->GetData(IPXWAN_INTERFACE_INFO_TYPE, 0, (LPBYTE *) &pIpxWanIf) );
pIpxWanIf->AdminState = IsDlgButtonChecked(IDC_IIG_BTN_IPX_WAN) ?
ADMIN_STATE_ENABLED : ADMIN_STATE_DISABLED;
}
fReturn = RtrPropertyPage::OnApply();
Error:
return fReturn;
}
//----------------------------------------------------------------------------
// Function: CIpxIfGeneral::OnFiltersConfig
//
// does the actual call to MprUIFilterConfig for filter configuration.
//----------------------------------------------------------------------------
void IPXSummaryIfPageGeneral::OnFiltersConfig(
DWORD dwFilterDirection
)
{
CWaitCursor wait;
SPIInfoBase spInfoBase;
m_pIPXPropSheet->GetInfoBase(&spInfoBase);
if (FHrOK(MprUIFilterConfigInfoBase(this->GetSafeHwnd(),
spInfoBase,
NULL,
PID_IPX,
dwFilterDirection)))
{
SetDirty(TRUE);
SetModified();
}
}
/*---------------------------------------------------------------------------
IPXSummaryIfPageConfig
---------------------------------------------------------------------------*/
IPXSummaryIfPageConfig::~IPXSummaryIfPageConfig()
{
if (m_pIPXConn)
{
m_pIPXConn->Release();
m_pIPXConn = NULL;
}
}
BEGIN_MESSAGE_MAP(IPXSummaryIfPageConfig, RtrPropertyPage)
//{{AFX_MSG_MAP(IPXSummaryIfPageConfig)
ON_EN_CHANGE(IDC_IIC_EDIT_NETNUMBER, OnChangeEdit)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/*!--------------------------------------------------------------------------
IPXSummaryIfPageConfig::Init
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryIfPageConfig::Init(IInterfaceInfo *pIfInfo,
IPXConnection *pIPXConn,
IPXSummaryInterfaceProperties *pPropSheet)
{
// create the error info object
CreateTFSErrorInfo(0);
m_spIf.Set(pIfInfo);
m_pIPXConn = pIPXConn;
pIPXConn->AddRef();
m_pIPXPropSheet = pPropSheet;
m_fNetNumberChanged = FALSE;
HRESULT hr = hrOK;
SPIRemoteRouterConfig spRemote;
SPIRouterInfo spRouter;
COSERVERINFO csi;
COAUTHINFO cai;
COAUTHIDENTITY caid;
ZeroMemory(&csi, sizeof(csi));
ZeroMemory(&cai, sizeof(cai));
ZeroMemory(&caid, sizeof(caid));
csi.pAuthInfo = &cai;
cai.pAuthIdentityData = &caid;
// If there's no interface (such as for dial-in clients) don't
// add the config page
if (!m_spIf)
return S_FALSE;
m_spIf->GetParentRouterInfo(&spRouter);
// Now try to cocreate the object
if (m_spRemote == NULL)
{
LPCOLESTR pszMachine = m_spIf->GetMachineName();
IUnknown * punk = NULL;
hr = CoCreateRouterConfig(pszMachine,
spRouter,
&csi,
IID_IRemoteRouterConfig,
&punk);
spRemote = (IRemoteRouterConfig *) punk;
}
if (FHrSucceeded(hr))
{
DWORD dwNet;
m_spRemote = spRemote.Transfer();
hr = m_spRemote->GetIpxVirtualNetworkNumber(&dwNet);
m_dwNetNumber = dwNet;
}
if (!HandleIRemoteRouterConfigErrors(hr, m_spIf->GetMachineName()))
{
// other misc errors
AddSystemErrorMessage(hr);
AddHighLevelErrorStringId(IDS_ERR_IPXCONFIG_CANNOT_SHOW);
}
if (csi.pAuthInfo)
delete csi.pAuthInfo->pAuthIdentityData->Password;
return hr;
}
BOOL IPXSummaryIfPageConfig::OnPropertyChange(BOOL bScopePane, LONG_PTR *pChangeMask)
{
BOOL fReturn = TRUE;
m_hrRemote = hrOK;
if ( m_pIPXPropSheet->IsCancel() )
{
RtrPropertyPage::OnPropertyChange(bScopePane, pChangeMask);
return FALSE;
}
if (m_fNetNumberChanged)
{
Assert(m_spRemote);
m_hrRemote = m_spRemote->SetIpxVirtualNetworkNumber(m_dwNetNumber);
fReturn = FHrSucceeded(m_hrRemote);
}
BOOL fPageReturn = RtrPropertyPage::OnPropertyChange(bScopePane, pChangeMask);
// Only if both calls succeeded, do we return TRUE
return fPageReturn && fReturn;
}
/*!--------------------------------------------------------------------------
IPXSummaryIfPageConfig::OnInitDialog
-
Author: KennT
---------------------------------------------------------------------------*/
BOOL IPXSummaryIfPageConfig::OnInitDialog()
{
HRESULT hr = hrOK;
TCHAR szNetNumber[64];
RtrPropertyPage::OnInitDialog();
wsprintf(szNetNumber, _T("%08lx"), m_dwNetNumber);
SetDlgItemText(IDC_IIC_EDIT_NETNUMBER, szNetNumber);
SetDirty(m_pIPXPropSheet->m_bNewInterface ? TRUE : FALSE);
//Error:
if (!FHrSucceeded(hr))
Cancel();
return FHrSucceeded(hr) ? TRUE : FALSE;
}
/*!--------------------------------------------------------------------------
IPXSummaryIfPageConfig::DoDataExchange
-
Author: KennT
---------------------------------------------------------------------------*/
void IPXSummaryIfPageConfig::DoDataExchange(CDataExchange *pDX)
{
RtrPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(IPXSummaryIfPageConfig)
//}}AFX_DATA_MAP
}
/*!--------------------------------------------------------------------------
IPXSummaryIfPageConfig::OnApply
-
Author: KennT
---------------------------------------------------------------------------*/
BOOL IPXSummaryIfPageConfig::OnApply()
{
BOOL fReturn;
DWORD dwNetNumber;
CString stNetNumber;
HRESULT hr = hrOK;
if ( m_pIPXPropSheet->IsCancel() )
{
CancelApply();
return TRUE;
}
// Get the value from the edit control
// ----------------------------------------------------------------
GetDlgItemText(IDC_IIC_EDIT_NETNUMBER, stNetNumber);
// Convert this text string into a hex number
// ----------------------------------------------------------------
dwNetNumber = _tcstoul(stNetNumber, NULL, 16);
// Only attempt to write if the value actually changd.
// ----------------------------------------------------------------
if (m_spRemote && (dwNetNumber != m_dwNetNumber))
{
m_dwNetNumber = dwNetNumber;
m_fNetNumberChanged = TRUE;
}
fReturn = RtrPropertyPage::OnApply();
// If this fails warn the user
// ----------------------------------------------------------------
if (!FHrSucceeded(hr))
{
DisplayErrorMessage(GetSafeHwnd(), hr);
}
else if (!FHrSucceeded(m_hrRemote))
{
// Return to this page
// ------------------------------------------------------------
GetParent()->PostMessage(PSM_SETCURSEL, 0, (LPARAM) GetSafeHwnd());
AddHighLevelErrorStringId(IDS_ERR_CANNOT_SAVE_IPXCONFIG);
AddSystemErrorMessage(m_hrRemote);
DisplayTFSErrorMessage(NULL);
fReturn = FALSE;
}
return fReturn;
}
void IPXSummaryIfPageConfig::OnChangeEdit()
{
SetDirty(TRUE);
SetModified();
}
/*---------------------------------------------------------------------------
IPXSummaryPageGeneral
---------------------------------------------------------------------------*/
BEGIN_MESSAGE_MAP(IPXSummaryPageGeneral, RtrPropertyPage)
//{{AFX_MSG_MAP(IPXSummaryPageGeneral)
ON_BN_CLICKED(IDC_IGG_BTN_LOG_ERRORS, OnButtonClicked)
ON_BN_CLICKED(IDC_IGG_BTN_LOG_INFO, OnButtonClicked)
ON_BN_CLICKED(IDC_IGG_BTN_LOG_NONE, OnButtonClicked)
ON_BN_CLICKED(IDC_IGG_BTN_LOG_WARNINGS, OnButtonClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void IPXSummaryPageGeneral::OnButtonClicked()
{
SetDirty(TRUE);
SetModified();
}
/*!--------------------------------------------------------------------------
IPXSummaryPageGeneral::Init
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryPageGeneral::Init(IPXSummaryProperties *pPropSheet)
{
m_pIPXPropSheet = pPropSheet;
return hrOK;
}
/*!--------------------------------------------------------------------------
IPXSummaryPageGeneral::OnInitDialog
-
Author: KennT
---------------------------------------------------------------------------*/
BOOL IPXSummaryPageGeneral::OnInitDialog()
{
HRESULT hr= hrOK;
SPIInfoBase spInfoBase;
PIPX_GLOBAL_INFO pGlobalInfo = NULL;
RtrPropertyPage::OnInitDialog();
//
// Load the existing global-config
//
CORg( m_pIPXPropSheet->GetInfoBase(&spInfoBase) );
//
// Retrieve the global-info, to set the 'Enable filtering' checkbox
// and the logging levels.
//
CORg( spInfoBase->GetData(IPX_GLOBAL_INFO_TYPE,
0,
(BYTE **) &pGlobalInfo) );
// Initialize the logging-level buttons
//
SetLogLevelButtons(pGlobalInfo->EventLogMask);
SetDirty(FALSE);
Error:
if (!FHrSucceeded(hr))
Cancel();
return FHrSucceeded(hr) ? TRUE : FALSE;
}
/*!--------------------------------------------------------------------------
IPXSummaryPageGeneral::DoDataExchange
-
Author: KennT
---------------------------------------------------------------------------*/
void IPXSummaryPageGeneral::DoDataExchange(CDataExchange *pDX)
{
RtrPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(IPXSummaryPageGeneral)
//}}AFX_DATA_MAP
}
BOOL IPXSummaryPageGeneral::OnApply()
{
SPIInfoBase spInfoBase;
BOOL fReturn;
HRESULT hr = hrOK;
PIPX_GLOBAL_INFO pgi;
if ( m_pIPXPropSheet->IsCancel() )
{
CancelApply();
return TRUE;
}
//
// Save the 'Enable filtering' setting
//
CORg( m_pIPXPropSheet->GetInfoBase(&spInfoBase) );
CORg( spInfoBase->GetData(IPX_GLOBAL_INFO_TYPE, 0, (BYTE **) &pgi) );
pgi->EventLogMask = QueryLogLevelButtons();
fReturn = RtrPropertyPage::OnApply();
Error:
if (!FHrSucceeded(hr))
fReturn = FALSE;
return fReturn;
}
/*!--------------------------------------------------------------------------
IPXSummaryPageGeneral::SetLogLevelButtons
-
Author: KennT
---------------------------------------------------------------------------*/
void IPXSummaryPageGeneral::SetLogLevelButtons(DWORD dwLogLevel)
{
switch (dwLogLevel)
{
case 0:
CheckDlgButton(IDC_IGG_BTN_LOG_NONE, TRUE);
break;
case EVENTLOG_ERROR_TYPE:
CheckDlgButton(IDC_IGG_BTN_LOG_ERRORS, TRUE);
break;
case EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE:
CheckDlgButton(IDC_IGG_BTN_LOG_WARNINGS, TRUE);
break;
case EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE:
default:
CheckDlgButton(IDC_IGG_BTN_LOG_INFO, TRUE);
break;
}
}
/*!--------------------------------------------------------------------------
IPXSummaryPageGeneral::QueryLogLevelButtons
Called to get the value set by the 'Logging level' radio-buttons.
Author: KennT
---------------------------------------------------------------------------*/
DWORD IPXSummaryPageGeneral::QueryLogLevelButtons()
{
if (IsDlgButtonChecked(IDC_IGG_BTN_LOG_INFO))
return EVENTLOG_INFORMATION_TYPE |
EVENTLOG_WARNING_TYPE |
EVENTLOG_ERROR_TYPE;
else if (IsDlgButtonChecked(IDC_IGG_BTN_LOG_WARNINGS))
return EVENTLOG_WARNING_TYPE |
EVENTLOG_ERROR_TYPE;
else if (IsDlgButtonChecked(IDC_IGG_BTN_LOG_ERRORS))
return EVENTLOG_ERROR_TYPE;
else
return 0;
}
/*---------------------------------------------------------------------------
IPXSummaryProperties implementation
---------------------------------------------------------------------------*/
IPXSummaryProperties::IPXSummaryProperties(ITFSNode *pNode,
IComponentData *pComponentData,
ITFSComponentData *pTFSCompData,
LPCTSTR pszSheetName,
CWnd *pParent,
UINT iPage,
BOOL fScopePane)
: RtrPropertySheet(pNode, pComponentData, pTFSCompData,
pszSheetName, pParent, iPage, fScopePane),
m_pageGeneral(IDD_IPX_GLOBAL_GENERAL_PAGE)
{
m_spNode.Set(pNode);
}
/*!--------------------------------------------------------------------------
IPXSummaryProperties::Init
Initialize the property sheets. The general action here will be
to initialize/add the various pages.
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryProperties::Init(IRtrMgrInfo *pRm)
{
HRESULT hr = hrOK;
IPXConnection * pIPXConn;
BaseIPXResultNodeData * pData;
SPIRouterInfo spRouter;
m_spRm.Set(pRm);
pIPXConn = GET_IPXSUMMARY_NODEDATA(m_spNode);
// The pages are embedded members of the class
// do not delete them.
m_bAutoDeletePages = FALSE;
// Get the router info
CORg( pRm->GetParentRouterInfo(&spRouter) );
// Initialize the infobase
// Do this here, because the init is called in the context
// of the main thread
CORg( LoadInfoBase(pIPXConn) );
m_pageGeneral.Init(this);
AddPageToList((CPropertyPageBase*) &m_pageGeneral);
Error:
return hr;
}
/*!--------------------------------------------------------------------------
IPXSummaryProperties::LoadInfoBase
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryProperties::LoadInfoBase(IPXConnection *pIPXConn)
{
Assert(pIPXConn);
HRESULT hr = hrOK;
HANDLE hTransport = NULL;
LPCOLESTR pszInterfaceId;
SPIInfoBase spInfoBase;
BYTE * pDefault;
Assert(m_spRm);
// Get the transport handle
CWRg( ::MprConfigTransportGetHandle(pIPXConn->GetConfigHandle(),
PID_IPX,
&hTransport) );
// Load the current IPX global info
CORg( m_spRm->GetInfoBase(pIPXConn->GetConfigHandle(),
hTransport,
&spInfoBase,
NULL) );
// Ensure that the global info block for IPX exists, adding
// the default block if none is found.
if (!FHrOK(spInfoBase->BlockExists(IPX_GLOBAL_INFO_TYPE)))
{
IPX_GLOBAL_INFO ipxgl;
ipxgl.RoutingTableHashSize = IPX_MEDIUM_ROUTING_TABLE_HASH_SIZE;
ipxgl.EventLogMask = EVENTLOG_ERROR_TYPE |
EVENTLOG_WARNING_TYPE;
CORg( spInfoBase->AddBlock(IPX_GLOBAL_INFO_TYPE,
sizeof(ipxgl),
(PBYTE) &ipxgl,
1 /* dwCount */,
0 /* bRemoveFirst */) );
}
Error:
if (!FHrSucceeded(hr))
spInfoBase.Release();
m_spInfoBase.Release();
m_spInfoBase = spInfoBase.Transfer();
return hr;
}
/*!--------------------------------------------------------------------------
IPXSummaryProperties::GetInfoBase
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IPXSummaryProperties::GetInfoBase(IInfoBase **ppInfoBase)
{
Assert(ppInfoBase);
*ppInfoBase = m_spInfoBase;
m_spInfoBase->AddRef();
return hrOK;
}
BOOL IPXSummaryProperties::SaveSheetData()
{
Assert(m_spRm);
// Save the global info
// We don't need to pass in the hMachine, hTransport since they
// got set up in the Load call.
m_spRm->Save(m_spRm->GetMachineName(), // pszMachine
0, // hMachine
0, // hTransport
m_spInfoBase, // pGlobalInfo
NULL, // pClientInfo
0); // dwDeleteProtocolId
return TRUE;
}