Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

308 lines
8.4 KiB

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
root.cpp
Root node information (the root node is not displayed
in the MMC framework but contains information such as
all of the subnodes in this snapin).
FILE HISTORY:
*/
#include "stdafx.h"
#include "ATLKROOT.h"
#include "ATLKVIEW.h" // ATLK handlers
#include "rtrcfg.h"
/*---------------------------------------------------------------------------
RipRootHandler implementation
---------------------------------------------------------------------------*/
DEBUG_DECLARE_INSTANCE_COUNTER(ATLKRootHandler)
extern const ContainerColumnInfo s_rgATLKInterfaceStatsColumnInfo[];
extern const ContainerColumnInfo s_rgATLKGroupStatsColumnInfo[];
struct _ViewInfoColumnEntry
{
UINT m_ulId;
UINT m_cColumns;
const ContainerColumnInfo *m_prgColumn;
};
//static const struct _ViewInfoColumnEntry s_rgViewColumnInfo[] =
//{
// { ATLKSTRM_STATS_ATLKNBR, MVR_ATLKGROUP_COUNT, s_rgATLKGroupStatsColumnInfo },
// { ATLKSTRM_IFSTATS_ATLKNBR, MVR_ATLKINTERFACE_COUNT, s_rgATLKInterfaceStatsColumnInfo },
//};
ATLKRootHandler::ATLKRootHandler(ITFSComponentData *pCompData)
: RootHandler(pCompData)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(ATLKRootHandler)
// m_ConfigStream.Init(DimensionOf(s_rgViewColumnInfo));
// for (int i=0; i<DimensionOf(s_rgViewColumnInfo); i++)
// {
// m_ConfigStream.InitViewInfo(s_rgViewColumnInfo[i].m_ulId,
// s_rgViewColumnInfo[i].m_cColumns,
// s_rgViewColumnInfo[i].m_prgColumn);
// }
}
STDMETHODIMP ATLKRootHandler::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 RootHandler::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;
}
///////////////////////////////////////////////////////////////////////////////
//// IPersistStream interface members
STDMETHODIMP ATLKRootHandler::GetClassID
(
CLSID *pClassID
)
{
ASSERT(pClassID != NULL);
// Copy the CLSID for this snapin
*pClassID = CLSID_ATLKAdminExtension;
return hrOK;
}
/*!--------------------------------------------------------------------------
ATLKRootHandler::OnExpand
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT ATLKRootHandler::OnExpand(ITFSNode *pNode,LPDATAOBJECT pDataObject, DWORD dwType, LPARAM arg,LPARAM lParam)
{
HRESULT hr = hrOK;
SPITFSNode spNode;
SPIRtrMgrProtocolInfo spRmProt;
SPIRouterInfo spRouterInfo;
// Grab the router info from the dataobject
spRouterInfo.Query(pDataObject);
Assert(spRouterInfo);
// dont expand AppleTalk node if remote or
// appletalk isnt installed
if ( !IsLocalMachine(spRouterInfo->GetMachineName()) ||
FHrFailed(IsATLKValid(spRouterInfo)) )
{
hr=hrFail;
goto Error;
}
CORg( AddProtocolNode(pNode, spRouterInfo) );
Error:
return hr;
}
HRESULT ATLKRootHandler::IsATLKValid(IRouterInfo *pRouter)
{
RegKey regkey;
DWORD dwRtrType=0;
HRESULT hr = hrOK;
if ( ERROR_SUCCESS != regkey.Open(HKEY_LOCAL_MACHINE, c_szRegKeyAppletalk) )
{
return hrFail;
}
// If the Router is not a RAS router, then don't show AppleTalk
// ----------------------------------------------------------------
if ( ! (pRouter->GetRouterType() & (ROUTER_TYPE_RAS | ROUTER_TYPE_LAN)) )
{
return hrFail;
}
return hr;
}
/*!--------------------------------------------------------------------------
ATLKRootHandler::OnCreateDataObject
Implementation of ITFSNodeHandler::OnCreateDataObject
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP ATLKRootHandler::OnCreateDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, IDataObject **ppDataObject)
{
HRESULT hr = hrOK;
CDataObject * pObject = NULL;
SPIDataObject spDataObject;
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
SPIRouterInfo spRouterInfo;
COM_PROTECT_TRY
{
//if ( m_spRouterInfo == NULL )
if (TRUE)
{
// If we haven't created the sub nodes yet, we still have to
// create a dataobject.
pObject = new CDataObject;
spDataObject = pObject; // do this so that it gets released correctly
Assert(pObject != NULL);
// Save cookie and type for delayed rendering
pObject->SetType(type);
pObject->SetCookie(cookie);
// Store the coclass with the data object
pObject->SetClsid(*(m_spTFSCompData->GetCoClassID()));
pObject->SetTFSComponentData(m_spTFSCompData);
hr = pObject->QueryInterface(IID_IDataObject,
reinterpret_cast<void**>(ppDataObject));
}
else
hr = CreateDataObjectFromRouterInfo(spRouterInfo,
spRouterInfo->GetMachineName(),
type, cookie, m_spTFSCompData,
ppDataObject, NULL, FALSE);
}
COM_PROTECT_CATCH;
return hr;
}
ImplementEmbeddedUnknown(ATLKRootHandler, IRtrAdviseSink)
STDMETHODIMP ATLKRootHandler::EIRtrAdviseSink::OnChange(LONG_PTR ulConn,
DWORD dwChangeType,
DWORD dwObjectType,
LPARAM lUserParam,
LPARAM lParam)
{
InitPThis(ATLKRootHandler, IRtrAdviseSink);
HRESULT hr = hrOK;
SPITFSNode spNode;
if ( dwObjectType != ROUTER_OBJ_RmProt )
return hr;
COM_PROTECT_TRY
{
if ( dwChangeType == ROUTER_CHILD_ADD )
{
}
else if ( dwChangeType == ROUTER_CHILD_DELETE )
{
}
}
COM_PROTECT_CATCH;
return hr;
}
/*!--------------------------------------------------------------------------
ATLKRootHandler::DestroyHandler
-
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP ATLKRootHandler::DestroyHandler(ITFSNode *pNode)
{
return hrOK;
}
/*!--------------------------------------------------------------------------
ATLKRootHandler::AddProtocolNode
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT ATLKRootHandler::AddProtocolNode(ITFSNode *pNode, IRouterInfo * pRouterInfo)
{
SPITFSNodeHandler spHandler;
ATLKNodeHandler * pHandler = NULL;
HRESULT hr = hrOK;
SPITFSNode spNode;
pHandler = new ATLKNodeHandler(m_spTFSCompData);
spHandler = pHandler;
CORg( pHandler->Init(pRouterInfo, &m_ConfigStream) );
CreateContainerTFSNode(&spNode,
&GUID_ATLKNodeType,
static_cast<ITFSNodeHandler *>(pHandler),
static_cast<ITFSResultHandler *>(pHandler),
m_spNodeMgr);
// Call to the node handler to init the node data
pHandler->ConstructNode(spNode);
// Make the node immediately visible
spNode->SetVisibilityState(TFS_VIS_SHOW);
pNode->AddChild(spNode);
Error:
return hr;
}
/*!--------------------------------------------------------------------------
ATLKRootHandler::RemoveProtocolNode
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT ATLKRootHandler::RemoveProtocolNode(ITFSNode *pNode)
{
Assert(pNode);
SPITFSNodeEnum spNodeEnum;
SPITFSNode spNode;
HRESULT hr = hrOK;
CORg( pNode->GetEnum(&spNodeEnum) );
while ( spNodeEnum->Next(1, &spNode, NULL) == hrOK )
{
pNode->RemoveChild(spNode);
spNode->Destroy();
spNode.Release();
}
Error:
return hr;
}