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