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

214 lines
5.6 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1998 **/
/**********************************************************************/
/*
ipxface
Base IPX interface node handler
FILE HISTORY:
*/
#include "stdafx.h"
#include "ipxface.h"
#include "ipxadmin.h" // for CreateDataObjectFromInterfaceInfo
#include "column.h" // for ComponentConfigStream
#include "ipxconn.h" // for IPXConnection
#include "format.h" // for FormatNumber
BaseIPXResultNodeData::BaseIPXResultNodeData()
{
#ifdef DEBUG
StrCpy(m_szDebug, _T("BaseIPXResultNodeData"));
#endif
m_pIPXConnection = NULL;
m_fClient = FALSE;
}
BaseIPXResultNodeData::~BaseIPXResultNodeData()
{
if (m_pIPXConnection)
m_pIPXConnection->Release();
m_pIPXConnection = NULL;
}
HRESULT BaseIPXResultNodeData::Init(ITFSNode *pNode, IInterfaceInfo *pIf,
IPXConnection *pIPXConn)
{
HRESULT hr = hrOK;
BaseIPXResultNodeData * pData = NULL;
pData = new BaseIPXResultNodeData;
pData->m_spIf.Set(pIf);
pData->m_pIPXConnection = pIPXConn;
pIPXConn->AddRef();
SET_BASEIPXRESULT_NODEDATA(pNode, pData);
return hr;
}
HRESULT BaseIPXResultNodeData::Free(ITFSNode *pNode)
{
BaseIPXResultNodeData * pData = GET_BASEIPXRESULT_NODEDATA(pNode);
ASSERT_BASEIPXRESULT_NODEDATA(pData);
pData->m_spIf.Release();
delete pData;
SET_BASEIPXRESULT_NODEDATA(pNode, NULL);
return hrOK;
}
/*---------------------------------------------------------------------------
BaseIPXResultHandler implementation
---------------------------------------------------------------------------*/
DEBUG_DECLARE_INSTANCE_COUNTER(BaseIPXResultHandler)
IMPLEMENT_ADDREF_RELEASE(BaseIPXResultHandler)
STDMETHODIMP BaseIPXResultHandler::QueryInterface(REFIID riid, LPVOID *ppv)
{
// Is the pointer bad?
if (ppv == NULL)
return E_INVALIDARG;
// Place NULL in *ppv in case of failure
*ppv = NULL;
// This is the non-delegating IUnknown implementation
if (riid == IID_IUnknown)
*ppv = (LPVOID) this;
else if (riid == IID_IRtrAdviseSink)
*ppv = &m_IRtrAdviseSink;
else
return CBaseResultHandler::QueryInterface(riid, ppv);
// If we're going to return an interface, AddRef it first
if (*ppv)
{
((LPUNKNOWN) *ppv)->AddRef();
return hrOK;
}
else
return E_NOINTERFACE;
}
/*---------------------------------------------------------------------------
NodeHandler implementation
---------------------------------------------------------------------------*/
/*!--------------------------------------------------------------------------
BaseIPXResultHandler::GetString
-
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP_(LPCTSTR) BaseIPXResultHandler::GetString(ITFSComponent * pComponent,
MMC_COOKIE cookie,
int nCol)
{
Assert(m_spNodeMgr);
SPITFSNode spNode;
BaseIPXResultNodeData * pData;
ConfigStream * pConfig;
m_spNodeMgr->FindNode(cookie, &spNode);
Assert(spNode);
pData = GET_BASEIPXRESULT_NODEDATA(spNode);
Assert(pData);
ASSERT_BASEIPXRESULT_NODEDATA(pData);
pComponent->GetUserData((LONG_PTR *) &pConfig);
Assert(pConfig);
return pData->m_rgData[pConfig->MapColumnToSubitem(m_ulColumnId, nCol)].m_stData;
}
/*!--------------------------------------------------------------------------
BaseIPXResultHandler::CompareItems
-
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP_(int) BaseIPXResultHandler::CompareItems(ITFSComponent * pComponent, MMC_COOKIE cookieA, MMC_COOKIE cookieB, int nCol)
{
ConfigStream * pConfig;
pComponent->GetUserData((LONG_PTR *) &pConfig);
Assert(pConfig);
int nSubItem = pConfig->MapColumnToSubitem(m_ulColumnId, nCol);
if (pConfig->GetSortCriteria(m_ulColumnId, nCol) == CON_SORT_BY_DWORD)
{
SPITFSNode spNodeA, spNodeB;
BaseIPXResultNodeData * pNodeDataA, *pNodeDataB;
m_spNodeMgr->FindNode(cookieA, &spNodeA);
m_spNodeMgr->FindNode(cookieB, &spNodeB);
pNodeDataA = GET_BASEIPXRESULT_NODEDATA(spNodeA);
ASSERT_BASEIPXRESULT_NODEDATA(pNodeDataA);
pNodeDataB = GET_BASEIPXRESULT_NODEDATA(spNodeB);
ASSERT_BASEIPXRESULT_NODEDATA(pNodeDataB);
return pNodeDataA->m_rgData[nSubItem].m_dwData -
pNodeDataB->m_rgData[nSubItem].m_dwData;
}
else
return StriCmpW(GetString(pComponent, cookieA, nCol),
GetString(pComponent, cookieB, nCol));
}
ImplementEmbeddedUnknown(BaseIPXResultHandler, IRtrAdviseSink)
STDMETHODIMP BaseIPXResultHandler::EIRtrAdviseSink::OnChange(LONG_PTR ulConn,
DWORD dwChangeType, DWORD dwObjectType, LPARAM lUserParam, LPARAM lParam)
{
InitPThis(BaseIPXResultHandler, IRtrAdviseSink);
HRESULT hr = hrOK;
Panic0("Should never reach here, interface nodes have no children");
return hr;
}
HRESULT BaseIPXResultHandler::Init(IInterfaceInfo *pIfInfo, ITFSNode *pParent)
{
return hrOK;
}
STDMETHODIMP BaseIPXResultHandler::DestroyResultHandler(MMC_COOKIE cookie)
{
SPITFSNode spNode;
m_spNodeMgr->FindNode(cookie, &spNode);
BaseIPXResultNodeData::Free(spNode);
BaseRouterHandler::DestroyResultHandler(cookie);
return hrOK;
}
/*!--------------------------------------------------------------------------
FillInNumberData
-
Author: KennT
---------------------------------------------------------------------------*/
void FillInNumberData(BaseIPXResultNodeData *pNodeData, UINT iIndex,
DWORD dwData)
{
TCHAR szNumber[32];
FormatNumber(dwData, szNumber, DimensionOf(szNumber), FALSE);
pNodeData->m_rgData[iIndex].m_stData = szNumber;
pNodeData->m_rgData[iIndex].m_dwData = dwData;
}