|
|
/**********************************************************************/ /** Microsoft Windows/NT **/ /** Copyright(c) Microsoft Corporation, 1997 - 1999 **/ /**********************************************************************/
/*
nbprop.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 "nbprop.h"
#include "summary.h"
#include "ipxrtdef.h"
#include "filter.h"
extern "C" { #include "routprot.h"
};
IpxNBInterfaceProperties::IpxNBInterfaceProperties(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_NB_IF_GENERAL_PAGE) { m_spNode.Set(pNode); }
/*!--------------------------------------------------------------------------
IpxNBInterfaceProperties::Init Initialize the property sheets. The general action here will be to initialize/add the various pages. Author: KennT ---------------------------------------------------------------------------*/ HRESULT IpxNBInterfaceProperties::Init(IRtrMgrInfo *pRm, IInterfaceInfo *pIfInfo) { HRESULT hr = hrOK; IPXConnection * pIPXConn; BaseIPXResultNodeData * pData;
pData = GET_BASEIPXRESULT_NODEDATA(m_spNode); ASSERT_BASEIPXRESULT_NODEDATA(pData); pIPXConn = pData->m_pIPXConnection;
m_spRm.Set(pRm); m_spIf.Set(pIfInfo); // 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);
Error: return hr; }
/*!--------------------------------------------------------------------------
IpxNBInterfaceProperties::LoadInfoBase - Author: KennT ---------------------------------------------------------------------------*/ HRESULT IpxNBInterfaceProperties::LoadInfoBase(IPXConnection *pIPXConn) { Assert(pIPXConn); HRESULT hr = hrOK; SPIRouterInfo spRouterInfo; HANDLE hTransport= NULL; LPCOLESTR pszInterfaceId = NULL; SPIInfoBase spInfoBase; BYTE * pDefault; int cBlocks = 0;
// Get the transport handle
CWRg( ::MprConfigTransportGetHandle(pIPXConn->GetConfigHandle(), PID_IPX, &hTransport) ); // 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
// 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) );
//
// Future Opt. This should be made into a sync call rather
// than a Load.
//
// Reload the information for this router-manager interface
//
CORg( m_spRmIf->Load(m_spIf->GetMachineName(), NULL, NULL, NULL) );
//
// The parameters are all NULL so that we can use the
// default RPC handles.
//
CORg( 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) { IPX_IF_INFO ipx;
ipx.AdminState = ADMIN_STATE_ENABLED; ipx.NetbiosAccept = ADMIN_STATE_DISABLED; ipx.NetbiosDeliver = ADMIN_STATE_DISABLED; CORg( spInfoBase->AddBlock(IPX_INTERFACE_INFO_TYPE, sizeof(ipx), (PBYTE) &ipx, 1 /* count */, FALSE /* bRemoveFirst */) ); }
//
// Check that there is a block for WAN interface-status in the info,
// and insert the default block if none is found.
//
if (spInfoBase->BlockExists(IPXWAN_INTERFACE_INFO_TYPE) == hrFalse) { IPXWAN_IF_INFO ipxwan;
ipxwan.AdminState = ADMIN_STATE_DISABLED; CORg( spInfoBase->AddBlock(IPXWAN_INTERFACE_INFO_TYPE, sizeof(ipxwan), (PBYTE) &ipxwan, 1 /* count */, FALSE /* bRemoveFirst */) ); }
m_spInfoBase = spInfoBase.Transfer(); Error: return hr; }
/*!--------------------------------------------------------------------------
IpxNBInterfaceProperties::GetInfoBase - Author: KennT ---------------------------------------------------------------------------*/ HRESULT IpxNBInterfaceProperties::GetInfoBase(IInfoBase **ppInfoBase) { Assert(ppInfoBase); *ppInfoBase = m_spInfoBase; m_spInfoBase->AddRef();
return hrOK; }
BOOL IpxNBInterfaceProperties::SaveSheetData() { SPITFSNodeHandler spHandler; 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); m_spRm->Save(m_spRm->GetMachineName(), 0, 0, NULL, m_spInfoBase, 0); } else { Assert(m_spRmIf); m_spRmIf->Save(m_spIf->GetMachineName(), NULL, NULL, NULL, m_spInfoBase, 0); } }
// 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; }
/*!--------------------------------------------------------------------------
IpxNBInterfaceProperties::CancelSheetData - Author: KennT ---------------------------------------------------------------------------*/ void IpxNBInterfaceProperties::CancelSheetData() { }
/*---------------------------------------------------------------------------
IpxNBIfPageGeneral ---------------------------------------------------------------------------*/
IpxNBIfPageGeneral::~IpxNBIfPageGeneral() { if (m_pIPXConn) { m_pIPXConn->Release(); m_pIPXConn = NULL; } }
BEGIN_MESSAGE_MAP(IpxNBIfPageGeneral, RtrPropertyPage) //{{AFX_MSG_MAP(IpxNBIfPageGeneral)
ON_BN_CLICKED(IDC_NIG_BTN_ACCEPT, OnChangeButton) ON_BN_CLICKED(IDC_NIG_BTN_DELIVER_ALWAYS, OnChangeButton) ON_BN_CLICKED(IDC_NIG_BTN_DELIVER_NEVER, OnChangeButton) ON_BN_CLICKED(IDC_NIG_BTN_DELIVER_STATIC, OnChangeButton) ON_BN_CLICKED(IDC_NIG_BTN_DELIVER_WHEN_UP, OnChangeButton) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
void IpxNBIfPageGeneral::OnChangeButton() { SetDirty(TRUE); SetModified(); }
/*!--------------------------------------------------------------------------
IpxNBIfPageGeneral::Init - Author: KennT ---------------------------------------------------------------------------*/ HRESULT IpxNBIfPageGeneral::Init(IInterfaceInfo *pIfInfo, IPXConnection *pIPXConn, IpxNBInterfaceProperties *pPropSheet) { m_spIf.Set(pIfInfo); m_pIPXConn = pIPXConn; pIPXConn->AddRef(); m_pIPXPropSheet = pPropSheet; return hrOK; }
/*!--------------------------------------------------------------------------
IpxNBIfPageGeneral::OnInitDialog - Author: KennT ---------------------------------------------------------------------------*/ BOOL IpxNBIfPageGeneral::OnInitDialog() { HRESULT hr = hrOK; PBYTE pData; SPIInfoBase spInfoBase; IPX_IF_INFO * pIpxIf = NULL; IPXWAN_IF_INFO *pIpxWanIf = NULL; DWORD dwIfType; UINT iButton;
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_NIG_BTN_ACCEPT, pIpxIf->NetbiosAccept == ADMIN_STATE_ENABLED);
switch (pIpxIf->NetbiosDeliver) { case ADMIN_STATE_ENABLED: iButton = IDC_NIG_BTN_DELIVER_ALWAYS; break; case ADMIN_STATE_DISABLED: iButton = IDC_NIG_BTN_DELIVER_NEVER; break; case ADMIN_STATE_ENABLED_ONLY_FOR_NETBIOS_STATIC_ROUTING: iButton = IDC_NIG_BTN_DELIVER_STATIC; break; case ADMIN_STATE_ENABLED_ONLY_FOR_OPER_STATE_UP: iButton = IDC_NIG_BTN_DELIVER_WHEN_UP; break; default: Panic1("Unknown NetbiosDeliver state: %d", pIpxIf->NetbiosDeliver); iButton = -1; break; }
if (iButton != -1) CheckDlgButton(iButton, ENABLED);
SetDirty(FALSE);
Error: if (!FHrSucceeded(hr)) Cancel(); return FHrSucceeded(hr) ? TRUE : FALSE; }
/*!--------------------------------------------------------------------------
IpxNBIfPageGeneral::DoDataExchange - Author: KennT ---------------------------------------------------------------------------*/ void IpxNBIfPageGeneral::DoDataExchange(CDataExchange *pDX) { RtrPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(IpxNBIfPageGeneral)
//}}AFX_DATA_MAP
}
BOOL IpxNBIfPageGeneral::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->NetbiosAccept = IsDlgButtonChecked(IDC_NIG_BTN_ACCEPT) ? ADMIN_STATE_ENABLED : ADMIN_STATE_DISABLED;
if (IsDlgButtonChecked(IDC_NIG_BTN_DELIVER_ALWAYS)) pIpxIf->NetbiosDeliver = ADMIN_STATE_ENABLED; else if (IsDlgButtonChecked(IDC_NIG_BTN_DELIVER_NEVER)) pIpxIf->NetbiosDeliver = ADMIN_STATE_DISABLED; else if (IsDlgButtonChecked(IDC_NIG_BTN_DELIVER_STATIC)) pIpxIf->NetbiosDeliver = ADMIN_STATE_ENABLED_ONLY_FOR_NETBIOS_STATIC_ROUTING; else if (IsDlgButtonChecked(IDC_NIG_BTN_DELIVER_WHEN_UP)) pIpxIf->NetbiosDeliver = ADMIN_STATE_ENABLED_ONLY_FOR_OPER_STATE_UP; else { Panic0("A radio button in IPX NetBIOS Broadcasts interface config is not checked!"); } fReturn = RtrPropertyPage::OnApply();
Error: return fReturn; }
|