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

566 lines
15 KiB
C++

/**********************************************************************/
/** 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 "IpxStaticNBName.h"
#include "summary.h"
#include "ipxrtdef.h"
#include "filter.h"
#include "ipxutil.h"
extern "C"
{
#include "routprot.h"
};
// ---------------------------------------------------------------------------
// IpxStaticNBNamePropertySheet::IpxStaticNBNamePropertySheet
// Initialize the RtrPropertySheet and only Property Page.
// Author: Deonb
// ---------------------------------------------------------------------------
IpxStaticNBNamePropertySheet::IpxStaticNBNamePropertySheet(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_STATIC_NETBIOS_NAME_PROPERTYPAGE)
{
m_spNode = pNode;
}
// ---------------------------------------------------------------------------
// IpxStaticNBNamePropertySheet::Init
// Initialize the property sheets. The general action here will be
// to initialize/add the various pages.
// Author: Deonb
// ---------------------------------------------------------------------------
HRESULT IpxStaticNBNamePropertySheet::Init(
BaseIPXResultNodeData *pNodeData,
IInterfaceInfo * spInterfaceInfo)
{
HRESULT hr = hrOK;
BaseIPXResultNodeData * pData;
m_pNodeData = pNodeData;
m_spInterfaceInfo = spInterfaceInfo;
pData = GET_BASEIPXRESULT_NODEDATA(m_spNode);
ASSERT_BASEIPXRESULT_NODEDATA(pData);
// The pages are embedded members of the class
// do not delete them.
m_bAutoDeletePages = FALSE;
m_pageGeneral.Init(pNodeData, this);
AddPageToList((CPropertyPageBase*) &m_pageGeneral);
return S_OK;
}
// ---------------------------------------------------------------------------
// IpxStaticNBNamePropertySheet::SaveSheetData
// Not sure what this does - this is never called. Kenn had this so I'll just
// copy this too.
// Author: Deonb
// ---------------------------------------------------------------------------
BOOL IpxStaticNBNamePropertySheet::SaveSheetData()
{
SPITFSNodeHandler spHandler;
SPITFSNode spParent;
// By this time each page should have written its information out
// to the infobase
// 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;
}
// --------------------------------------------------------------------------
// IpxStaticNBNamePropertySheet::CancelSheetData
// -
// Author: Deonb
// ---------------------------------------------------------------------------
void IpxStaticNBNamePropertySheet::CancelSheetData()
{
}
// ***************************************************************************
// ---------------------------------------------------------------------------
// IpxStaticNBNamePropertyPage
// ---------------------------------------------------------------------------
IpxStaticNBNamePropertyPage::~IpxStaticNBNamePropertyPage()
{
}
BEGIN_MESSAGE_MAP(IpxStaticNBNamePropertyPage, RtrPropertyPage)
//{{AFX_MSG_MAP(IpxStaticNBNamePropertyPage)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void IpxStaticNBNamePropertyPage::OnChangeButton()
{
SetDirty(TRUE);
SetModified();
}
//--------------------------------------------------------------------------
// IpxStaticNBNamePropertyPage::Init
// -
// Author: Deonb
//---------------------------------------------------------------------------
HRESULT IpxStaticNBNamePropertyPage::Init(BaseIPXResultNodeData *pNodeData,
IpxStaticNBNamePropertySheet * pIPXPropSheet)
{
ATLASSERT(pSREntry);
ATLASSERT(pIPXPropSheet);
m_pIPXPropSheet = pIPXPropSheet;
m_SNEntry.LoadFrom(pNodeData);
m_InitSNEntry = m_SNEntry;
return hrOK;
}
// --------------------------------------------------------------------------
// IpxStaticNBNamePropertyPage::OnInitDialog
// -
// Author: Deonb
// ---------------------------------------------------------------------------
BOOL IpxStaticNBNamePropertyPage::OnInitDialog()
{
HRESULT hr = hrOK;
PBYTE pData;
DWORD dwIfType;
UINT iButton;
TCHAR szName[32];
TCHAR szType[32];
CString st;
USHORT uType;
RtrPropertyPage::OnInitDialog();
((CEdit *) GetDlgItem(IDC_SND_EDIT_NAME))->LimitText(15);
((CEdit *) GetDlgItem(IDC_SND_EDIT_TYPE))->LimitText(2);
FormatNetBIOSName(szName, &uType, (LPCSTR) m_SNEntry.m_name.Name);
st = szName;
st.TrimRight();
st.TrimLeft();
SetDlgItemText(IDC_SND_EDIT_NAME, st);
wsprintf(szType, _T("%.2x"), uType);
SetDlgItemText(IDC_SND_EDIT_TYPE, szType);
return TRUE;
}
// --------------------------------------------------------------------------
// IpxStaticNBNamePropertyPage::DoDataExchange
// -
// Author: Deonb
// ---------------------------------------------------------------------------
void IpxStaticNBNamePropertyPage::DoDataExchange(CDataExchange *pDX)
{
RtrPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(IpxStaticNBNamePropertyPage)
//}}AFX_DATA_MAP
}
// --------------------------------------------------------------------------
// IpxStaticNBNamePropertyPage::OnApply
// -
// Author: Deonb
// ---------------------------------------------------------------------------
BOOL IpxStaticNBNamePropertyPage::OnApply()
{
CString st;
BOOL fReturn;
HRESULT hr = hrOK;
USHORT uType;
if ( m_pIPXPropSheet->IsCancel() )
{
CancelApply();
return TRUE;
}
// Get the rest of the data
GetDlgItemText(IDC_SND_EDIT_TYPE, st);
uType = (USHORT) _tcstoul(st, NULL, 16);
GetDlgItemText(IDC_SND_EDIT_NAME, st);
st.TrimLeft();
st.TrimRight();
if (st.IsEmpty())
{
GetDlgItem(IDC_SND_EDIT_NAME)->SetFocus();
AfxMessageBox(IDS_ERR_INVALID_NETBIOS_NAME);
return FALSE;
}
ConvertToNetBIOSName((LPSTR) m_SNEntry.m_name.Name, st, uType);
ModifyNameInfo(m_pIPXPropSheet->m_spNode, &m_SNEntry, &m_InitSNEntry);
// Update the data in the UI
m_SNEntry.SaveTo(m_pIPXPropSheet->m_pNodeData);
m_pIPXPropSheet->m_spInterfaceInfo = m_SNEntry.m_spIf;
// Force a refresh
m_pIPXPropSheet->m_spNode->ChangeNode(RESULT_PANE_CHANGE_ITEM_DATA);
fReturn = RtrPropertyPage::OnApply();
return fReturn;
}
/*
// --------------------------------------------------------------------------
// IpxStaticNBNamePropertyPage::RemoveStaticService
// -
// Author: KennT
// ---------------------------------------------------------------------------
HRESULT IpxStaticNBNamePropertyPage::RemoveStaticService(SafeIPXSNListEntry *pSSEntry,
IInfoBase *pInfoBase)
{
HRESULT hr = hrOK;
InfoBlock * pBlock;
PIPX_STATIC_SERVICE_INFO pRow;
INT i;
// Get the IPX_STATIC_SERVICE_INFO block from the interface
CORg( pInfoBase->GetBlock(IPX_STATIC_SERVICE_INFO_TYPE, &pBlock, 0) );
// Look for the removed route in the IPX_STATIC_SERVICE_INFO
pRow = (IPX_STATIC_SERVICE_INFO*) pBlock->pData;
for (i = 0; i < (INT)pBlock->dwCount; i++, pRow++)
{
// Compare this route to the removed one
if (FAreTwoServicesEqual(pRow, &(pSSEntry->m_service)))
{
// This is the removed route, so modify this block
// to exclude the route:
// Decrement the number of Services
--pBlock->dwCount;
if (pBlock->dwCount && (i < (INT)pBlock->dwCount))
{
// Overwrite this route with the ones which follow it
::memmove(pRow,
pRow + 1,
(pBlock->dwCount - i) * sizeof(*pRow));
}
break;
}
}
Error:
return hr;
}
*/
/*--------------------------------------------------------------------------
IpxStaticNBNamePropertyPage::ModifyNameInfo
-
Author: Deonb
---------------------------------------------------------------------------*/
HRESULT IpxStaticNBNamePropertyPage::ModifyNameInfo(ITFSNode *pNode,
SafeIPXSNListEntry *pSNEntryNew,
SafeIPXSNListEntry *pSNEntryOld)
{
Assert(pSNEntryNew);
Assert(pSNEntryOld);
INT i;
HRESULT hr = hrOK;
InfoBlock* pBlock;
SPIInfoBase spInfoBase;
SPIRtrMgrInterfaceInfo spRmIf;
SPITFSNode spNodeParent;
IPXConnection * pIPXConn;
IPX_STATIC_NETBIOS_NAME_INFO *psr, *psrOld;
IPX_STATIC_NETBIOS_NAME_INFO IpxRow;
CWaitCursor wait;
pNode->GetParent(&spNodeParent);
pIPXConn = GET_IPX_SN_NODEDATA(spNodeParent);
Assert(pIPXConn);
// Remove the old name if it is on another interface
if (lstrcmpi(pSNEntryOld->m_spIf->GetId(), pSNEntryNew->m_spIf->GetId()) != 0)
{
// the outgoing interface for a name is to be changed.
CORg( pSNEntryOld->m_spIf->FindRtrMgrInterface(PID_IPX, &spRmIf) );
CORg( spRmIf->GetInfoBase(pIPXConn->GetConfigHandle(),
NULL,
NULL,
&spInfoBase));
// Remove the old interface
CORg( RemoveStaticNetBIOSName(pSNEntryOld, spInfoBase) );
// Update the interface information
CORg( spRmIf->Save(pSNEntryOld->m_spIf->GetMachineName(),
pIPXConn->GetConfigHandle(),
NULL,
NULL,
spInfoBase,
0));
}
spRmIf.Release();
spInfoBase.Release();
// Either
// (a) a name is being modified (on the same interface)
// (b) a name is being moved from one interface to another.
// Retrieve the configuration for the interface to which the name
// is now attached;
CORg( pSNEntryNew->m_spIf->FindRtrMgrInterface(PID_IPX, &spRmIf) );
CORg( spRmIf->GetInfoBase(pIPXConn->GetConfigHandle(),
NULL,
NULL,
&spInfoBase));
// Get the IPX_STATIC_NETBIOS_NAME_INFO block from the interface
hr = spInfoBase->GetBlock(IPX_STATIC_NETBIOS_NAME_INFO_TYPE, &pBlock, 0);
if (!FHrOK(hr))
{
//
// No IPX_STATIC_NETBIOS_NAME_INFO block was found; we create a new block
// with the new name, and add that block to the interface-info
//
CORg( AddStaticNetBIOSName(pSNEntryNew, spInfoBase, NULL) );
}
else
{
//
// An IPX_STATIC_NETBIOS_NAME_INFO block was found.
//
// We are modifying an existing name.
// If the name's interface was not changed when it was modified,
// look for the existing name in the IPX_STATIC_NETBIOS_NAME_INFO, and then
// update its parameters.
// Otherwise, write a completely new name in the IPX_STATIC_NETBIOS_NAME_INFO;
//
if (lstrcmpi(pSNEntryOld->m_spIf->GetId(), pSNEntryNew->m_spIf->GetId()) == 0)
{
//
// The name's interface was not changed when it was modified;
// We now look for it amongst the existing Names
// for this interface.
// The name's original parameters are in 'preOld',
// so those are the parameters with which we search
// for a name to modify
//
psr = (IPX_STATIC_NETBIOS_NAME_INFO*)pBlock->pData;
for (i = 0; i < (INT)pBlock->dwCount; i++, psr++)
{
// Compare this name to the re-configured one
if (!FAreTwoNamesEqual(&(pSNEntryOld->m_name), psr))
continue;
// This is the name which was modified;
// We can now modify the parameters for the name in-place.
*psr = pSNEntryNew->m_name;
break;
}
}
else
{
CORg( AddStaticNetBIOSName(pSNEntryNew, spInfoBase, pBlock) );
}
// Save the updated information
CORg( spRmIf->Save(pSNEntryNew->m_spIf->GetMachineName(),
pIPXConn->GetConfigHandle(),
NULL,
NULL,
spInfoBase,
0));
}
Error:
return hr;
}
/*!--------------------------------------------------------------------------
SafeIpxSNListEntry::LoadFrom
-
Author: Deonb
---------------------------------------------------------------------------*/
void SafeIPXSNListEntry::LoadFrom(BaseIPXResultNodeData *pNodeData)
{
m_spIf = pNodeData->m_spIf;
ConvertToNetBIOSName((LPSTR) m_name.Name,
pNodeData->m_rgData[IPX_SN_SI_NETBIOS_NAME].m_stData,
(USHORT) pNodeData->m_rgData[IPX_SN_SI_NETBIOS_TYPE].m_dwData);
}
/*!--------------------------------------------------------------------------
SafeIpxSNListEntry::SaveTo
-
Author: Deonb
---------------------------------------------------------------------------*/
void SafeIPXSNListEntry::SaveTo(BaseIPXResultNodeData *pNodeData)
{
TCHAR szName[32];
TCHAR szType[32];
CString st;
USHORT uType;
FormatNetBIOSName(szName, &uType,
(LPCSTR) m_name.Name);
st = szName;
st.TrimLeft();
st.TrimRight();
pNodeData->m_spIf.Set(m_spIf);
pNodeData->m_rgData[IPX_SN_SI_NAME].m_stData = m_spIf->GetTitle();
pNodeData->m_rgData[IPX_SN_SI_NETBIOS_NAME].m_stData = st;
wsprintf(szType, _T("%.2x"), uType);
pNodeData->m_rgData[IPX_SN_SI_NETBIOS_TYPE].m_stData = szType;
pNodeData->m_rgData[IPX_SN_SI_NETBIOS_TYPE].m_dwData = uType;
}
/*!--------------------------------------------------------------------------
IpxStaticNetBIOSNameHandler::RemoveStaticNetBIOSName
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT IpxStaticNBNamePropertyPage::RemoveStaticNetBIOSName(SafeIPXSNListEntry *pSNEntry,
IInfoBase *pInfoBase)
{
HRESULT hr = hrOK;
InfoBlock * pBlock;
PIPX_STATIC_NETBIOS_NAME_INFO pRow;
INT i;
// Get the IPX_STATIC_NETBIOS_NAME_INFO block from the interface
CORg( pInfoBase->GetBlock(IPX_STATIC_NETBIOS_NAME_INFO_TYPE, &pBlock, 0) );
// Look for the removed name in the IPX_STATIC_NETBIOS_NAME_INFO
pRow = (IPX_STATIC_NETBIOS_NAME_INFO*) pBlock->pData;
for (i = 0; i < (INT)pBlock->dwCount; i++, pRow++)
{
// Compare this name to the removed one
if (FAreTwoNamesEqual(pRow, &(pSNEntry->m_name)))
{
// This is the removed name, so modify this block
// to exclude the name:
// Decrement the number of Names
--pBlock->dwCount;
if (pBlock->dwCount && (i < (INT)pBlock->dwCount))
{
// Overwrite this name with the ones which follow it
::memmove(pRow,
pRow + 1,
(pBlock->dwCount - i) * sizeof(*pRow));
}
break;
}
}
Error:
return hr;
}
HRESULT AddStaticNetBIOSName(SafeIPXSNListEntry *pSNEntryNew,
IInfoBase *pInfoBase,
InfoBlock *pBlock)
{
IPX_STATIC_NETBIOS_NAME_INFO srRow;
HRESULT hr = hrOK;
if (pBlock == NULL)
{
//
// No IPX_STATIC_NETBIOS_NAME_INFO block was found; we create a new block
// with the new name, and add that block to the interface-info
//
CORg( pInfoBase->AddBlock(IPX_STATIC_NETBIOS_NAME_INFO_TYPE,
sizeof(IPX_STATIC_NETBIOS_NAME_INFO),
(LPBYTE) &(pSNEntryNew->m_name), 1, 0) );
}
else
{
// Either the name is completely new, or it is a name
// which was moved from one interface to another.
// Set a new block as the IPX_STATIC_NETBIOS_NAME_INFO,
// and include the re-configured name in the new block.
PIPX_STATIC_NETBIOS_NAME_INFO psrTable;
psrTable = new IPX_STATIC_NETBIOS_NAME_INFO[pBlock->dwCount + 1];
Assert(psrTable);
// Copy the original table of Names
::memcpy(psrTable, pBlock->pData,
pBlock->dwCount * sizeof(IPX_STATIC_NETBIOS_NAME_INFO));
// Append the new name
psrTable[pBlock->dwCount] = pSNEntryNew->m_name;
// Replace the old name-table with the new one
CORg( pInfoBase->SetData(IPX_STATIC_NETBIOS_NAME_INFO_TYPE,
sizeof(IPX_STATIC_NETBIOS_NAME_INFO),
(LPBYTE) psrTable, pBlock->dwCount + 1, 0) );
}
Error:
return hr;
}