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

644 lines
15 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
*/
#include "stdafx.h"
//nclude "rtrcomp.h" // columns information
#include "htmlhelp.h"
#include "dmvstrm.h"
#include "dmvcomp.h"
#include "dmvroot.h"
#include "dvsview.h"
#include "statreg.h"
#include "statreg.cpp"
#include "atlimpl.cpp"
#include "ifadmin.h"
#include "dialin.h"
#include "ports.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*---------------------------------------------------------------------------
Icon list
This is used to initialize the image list.
---------------------------------------------------------------------------*/
UINT g_uIconMap[IMAGE_IDX_MAX + 1][2] =
{
{ IDI_FOLDER_OPEN, IMAGE_IDX_FOLDER_OPEN },
{ IDI_FOLDER_CLOSED , IMAGE_IDX_FOLDER_CLOSED},
{ IDI_MACHINE, IMAGE_IDX_MACHINE },
{ IDI_MACHINE_ERROR, IMAGE_IDX_MACHINE_ERROR },
{ IDI_MACHINE_ACCESS_DENIED, IMAGE_IDX_MACHINE_ACCESS_DENIED },
{ IDI_MACHINE_STARTED, IMAGE_IDX_MACHINE_STARTED },
{ IDI_MACHINE_STOPPED, IMAGE_IDX_MACHINE_STOPPED },
{ IDI_MACHINE_WAIT, IMAGE_IDX_MACHINE_WAIT },
{ IDI_DOMAIN, IMAGE_IDX_DOMAIN },
{ IDI_NET_INTERFACES, IMAGE_IDX_INTERFACES },
{ IDI_NET_LAN_CARD, IMAGE_IDX_LAN_CARD },
{ IDI_NET_WAN_CARD, IMAGE_IDX_WAN_CARD },
{0, 0}
};
/*---------------------------------------------------------------------------
CDomainComponent
---------------------------------------------------------------------------*/
/////////////////////////////////////////////////////////////////////////////
// CDomainComponent implementation
CDMVComponent::CDMVComponent()
{
extern const ContainerColumnInfo s_rgDVSViewColumnInfo[];
extern const ContainerColumnInfo s_rgIfAdminColumnInfo[];
extern const ContainerColumnInfo s_rgDialInColumnInfo[];
extern const ContainerColumnInfo s_rgPortsColumnInfo[];
m_ComponentConfig.Init(DM_COLUMNS_MAX_COUNT);
m_ComponentConfig.InitViewInfo(DM_COLUMNS_DVSUM,
FALSE /* configurable columns */,
DVS_SI_MAX_COLUMNS,
TRUE,
s_rgDVSViewColumnInfo);
m_ComponentConfig.InitViewInfo(DM_COLUMNS_IFADMIN,
FALSE /* configurable columns */,
IFADMIN_MAX_COLUMNS,
TRUE,
s_rgIfAdminColumnInfo);
m_ComponentConfig.InitViewInfo(DM_COLUMNS_DIALIN,
FALSE /* configurable columns */,
DIALIN_MAX_COLUMNS,
TRUE,
s_rgDialInColumnInfo);
m_ComponentConfig.InitViewInfo(DM_COLUMNS_PORTS,
FALSE /* configurable columns */,
PORTS_MAX_COLUMNS,
TRUE,
s_rgPortsColumnInfo);
m_ulUserData = reinterpret_cast<LONG_PTR>(&m_ComponentConfig);
}
CDMVComponent::~CDMVComponent()
{
}
STDMETHODIMP_(ULONG) CDMVComponent::AddRef()
{
return TFSComponent::AddRef();
}
STDMETHODIMP_(ULONG) CDMVComponent::Release()
{
return TFSComponent::Release();
}
STDMETHODIMP CDMVComponent::QueryInterface(REFIID riid, LPVOID *ppv)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Is the pointer bad?
if (ppv == NULL)
return E_INVALIDARG;
// Place NULL in *ppv in case of failure
*ppv = NULL;
if (riid == IID_IPersistStreamInit)
*ppv = static_cast<IPersistStreamInit *>(this);
// If we're going to return an interface, AddRef it first
if (*ppv)
{
((LPUNKNOWN) *ppv)->AddRef();
return hrOK;
}
else
return TFSComponent::QueryInterface(riid, ppv);
}
STDMETHODIMP CDMVComponent::OnUpdateView(LPDATAOBJECT pDataObject, LPARAM arg, LPARAM param)
{
return TFSComponent::OnUpdateView(pDataObject, arg, param);
}
STDMETHODIMP CDMVComponent::InitializeBitmaps(MMC_COOKIE cookie)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(m_spImageList != NULL);
HRESULT hr = hrOK;
COM_PROTECT_TRY
{
// Set the images
HICON hIcon;
for (int i = 0; i < IMAGE_IDX_MAX; i++)
{
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(g_uIconMap[i][0]));
if (hIcon)
{
// call mmc
m_spImageList->ImageListSetIcon(reinterpret_cast<LONG_PTR*>(hIcon), g_uIconMap[i][1]);
}
}
}
COM_PROTECT_CATCH;
return hr;
}
STDMETHODIMP CDMVComponent::QueryDataObject(MMC_COOKIE cookie,
DATA_OBJECT_TYPES type,
LPDATAOBJECT *ppDataObject)
{
HRESULT hr = hrOK;
SPITFSNode spNode;
SPITFSResultHandler spResultHandler;
COM_PROTECT_TRY
{
CORg( m_spNodeMgr->FindNode(cookie, &spNode) );
CORg( spNode->GetResultHandler(&spResultHandler) );
CORg( spResultHandler->OnCreateDataObject(this, cookie,
type, ppDataObject) );
COM_PROTECT_ERROR_LABEL;
}
COM_PROTECT_CATCH;
return hr;
}
/*!--------------------------------------------------------------------------
CDMVComponent::OnSnapinHelp
-
---------------------------------------------------------------------------*/
STDMETHODIMP
CDMVComponent::OnSnapinHelp
(
LPDATAOBJECT pDataObject,
LPARAM arg,
LPARAM param
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
SPIConsole spConsole;
HWND hwndMain;
HRESULT hr = hrOK;
GetConsole(&spConsole);
spConsole->GetMainWindow(&hwndMain);
HtmlHelpA(hwndMain, "mprsnap.chm", HH_DISPLAY_TOPIC, 0);
return hr;
}
STDMETHODIMP CDMVComponent::GetClassID(LPCLSID lpClassID)
{
ASSERT(lpClassID != NULL);
// Copy the CLSID for this snapin
*lpClassID = CLSID_RouterSnapin;
return hrOK;
}
STDMETHODIMP CDMVComponent::IsDirty()
{
HRESULT hr = hrOK;
COM_PROTECT_TRY
{
hr = m_ComponentConfig.GetDirty() ? hrOK : hrFalse;
}
COM_PROTECT_CATCH;
return hr;
}
STDMETHODIMP CDMVComponent::Load(LPSTREAM pStm)
{
HRESULT hr = hrOK;
COM_PROTECT_TRY
{
hr = m_ComponentConfig.LoadFrom(pStm);
}
COM_PROTECT_CATCH;
return hr;
}
STDMETHODIMP CDMVComponent::Save(LPSTREAM pStm, BOOL fClearDirty)
{
HRESULT hr = hrOK;
SPITFSResultHandler spResultHandler;
COM_PROTECT_TRY
{
// Need to see if we can save the selected node
// -------------------------------------------------------------
if (m_spSelectedNode)
{
m_spSelectedNode->GetResultHandler(&spResultHandler);
if (spResultHandler)
spResultHandler->UserResultNotify(m_spSelectedNode,
RRAS_ON_SAVE, (LPARAM)(ITFSComponent *) this);
}
hr = m_ComponentConfig.SaveTo(pStm);
if (FHrSucceeded(hr) && fClearDirty)
m_ComponentConfig.SetDirty(FALSE);
}
COM_PROTECT_CATCH;
return hr;
}
STDMETHODIMP CDMVComponent::GetSizeMax(ULARGE_INTEGER FAR *pcbSize)
{
Assert(pcbSize);
HRESULT hr = hrOK;
ULONG cbSize = 0;
COM_PROTECT_TRY
{
hr = m_ComponentConfig.GetSize(&cbSize);
if (FHrSucceeded(hr))
{
pcbSize->HighPart = 0;
pcbSize->LowPart = cbSize;
}
}
COM_PROTECT_CATCH;
return hr;
}
STDMETHODIMP CDMVComponent::InitNew()
{
HRESULT hr = hrOK;
COM_PROTECT_TRY
{
hr = m_ComponentConfig.InitNew();
}
COM_PROTECT_CATCH;
return hr;
}
/////////////////////////////////////////////////////////////////////////////
// CDomainComponentData implementation
CDMVComponentData::CDMVComponentData()
{
}
/*!--------------------------------------------------------------------------
CDomainComponentData::OnInitialize
-
Author: EricDav, KennT
---------------------------------------------------------------------------*/
STDMETHODIMP CDMVComponentData::OnInitialize(LPIMAGELIST pScopeImage)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// Set the images
HICON hIcon;
Assert(pScopeImage);
// add the images for the scope tree
HRESULT hr = hrOK;
COM_PROTECT_TRY
{
for (int i = 0; i < IMAGE_IDX_MAX; i++)
{
hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(g_uIconMap[i][0]));
if (hIcon)
{
// call mmc
VERIFY(SUCCEEDED(pScopeImage->ImageListSetIcon(reinterpret_cast<LONG_PTR*>(hIcon), g_uIconMap[i][1])));
}
}
}
COM_PROTECT_CATCH;
return hr;
}
/*!--------------------------------------------------------------------------
CDomainComponentData::OnInitializeNodeMgr
-
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP CDMVComponentData::OnInitializeNodeMgr(ITFSComponentData *pTFSCompData, ITFSNodeMgr *pNodeMgr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// For now create a new node handler for each new node,
// this is rather bogus as it can get expensive. We can
// consider creating only a single node handler for each
// node type.
DMVRootHandler * pHandler = NULL;
SPITFSNodeHandler spHandler;
SPITFSNode spNode;
HRESULT hr = hrOK;
COM_PROTECT_TRY
{
pHandler = new DMVRootHandler(pTFSCompData);
// Do this so that it will get released correctly
spHandler = pHandler;
// Create the root node for this sick puppy
CORg( CreateContainerTFSNode(&spNode,
&GUID_RouterDomainNodeType,
pHandler,
pHandler /* result handler */,
pNodeMgr) );
// Construct the node
CORg( pHandler->ConstructNode(spNode) );
CORg( pHandler->Init(spNode) );
CORg( pNodeMgr->SetRootNode(spNode) );
// setup watermark info
/*
InitWatermarkInfo(AfxGetInstanceHandle(),
&m_WatermarkInfo,
IDB_WIZBANNER, // Header ID
IDB_WIZWATERMARK, // Watermark ID
NULL, // hPalette
FALSE); // bStretch
pTFSCompData->SetWatermarkInfo(&m_WatermarkInfo);
*/
// Reference the help file name.
pTFSCompData->SetHTMLHelpFileName(_T("mprsnap.chm"));
COM_PROTECT_ERROR_LABEL;
}
COM_PROTECT_CATCH;
return hr;
}
CDMVComponentData::~CDMVComponentData()
{
//ResetWatermarkInfo(&m_WatermarkInfo);
}
/*!--------------------------------------------------------------------------
CDomainComponentData::OnCreateComponent
-
Author: EricDav, KennT
---------------------------------------------------------------------------*/
STDMETHODIMP CDMVComponentData::OnCreateComponent(LPCOMPONENT *ppComponent)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
ASSERT(ppComponent != NULL);
HRESULT hr = hrOK;
CDMVComponent * pComp = NULL;
COM_PROTECT_TRY
{
pComp = new CDMVComponent;
if (FHrSucceeded(hr))
{
pComp->Construct(m_spNodeMgr,
static_cast<IComponentData *>(this),
m_spTFSComponentData);
*ppComponent = static_cast<IComponent *>(pComp);
}
}
COM_PROTECT_CATCH;
return hr;
}
STDMETHODIMP CDMVComponentData::OnDestroy()
{
m_spNodeMgr.Release();
return hrOK;
}
/*!--------------------------------------------------------------------------
CDomainComponentData::GetCoClassID
-
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP_(const CLSID *) CDMVComponentData::GetCoClassID()
{
return &CLSID_RouterSnapin;
}
/*!--------------------------------------------------------------------------
CDomainComponentData::OnCreateDataObject
-
Author: KennT
---------------------------------------------------------------------------*/
STDMETHODIMP CDMVComponentData::OnCreateDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, IDataObject **ppDataObject)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Assert(ppDataObject != NULL);
CDataObject * pObject = NULL;
SPIDataObject spDataObject;
HRESULT hr = hrOK;
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
if ( IS_SPECIAL_COOKIE(cookie) )
{
CDataObject * pObject = NULL;
SPIDataObject spDataObject;
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(CLSID_RouterSnapin);
pObject->SetTFSComponentData(m_spTFSComponentData);
hr = pObject->QueryInterface(IID_IDataObject, reinterpret_cast<void**>(ppDataObject));
}
else
{
COM_PROTECT_TRY
{
CORg( m_spNodeMgr->FindNode(cookie, &spNode) );
CORg( spNode->GetHandler(&spHandler) );
CORg( spHandler->OnCreateDataObject(cookie, type, &spDataObject) );
*ppDataObject = spDataObject.Transfer();
COM_PROTECT_ERROR_LABEL;
}
COM_PROTECT_CATCH;
}
return hr;
}
///////////////////////////////////////////////////////////////////////////////
//// IPersistStream interface members
STDMETHODIMP CDMVComponentData::GetClassID
(
CLSID *pClassID
)
{
ASSERT(pClassID != NULL);
// Copy the CLSID for this snapin
*pClassID = CLSID_RouterSnapin;
return hrOK;
}
STDMETHODIMP CDMVComponentData::IsDirty()
{
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
SPIPersistStreamInit spStm;
m_spNodeMgr->GetRootNode(&spNode);
spNode->GetHandler(&spHandler);
spStm.Query(spHandler);
Assert(spStm);
return (spNode->GetData(TFS_DATA_DIRTY) || spStm->IsDirty()) ? hrOK : hrFalse;
}
STDMETHODIMP CDMVComponentData::Load
(
IStream *pStm
)
{
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
SPIPersistStreamInit spStm;
m_spNodeMgr->GetRootNode(&spNode);
spNode->GetHandler(&spHandler);
spStm.Query(spHandler);
Assert(spStm);
return spStm->Load(pStm);
}
STDMETHODIMP CDMVComponentData::Save
(
IStream *pStm,
BOOL fClearDirty
)
{
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
SPIPersistStreamInit spStm;
m_spNodeMgr->GetRootNode(&spNode);
spNode->GetHandler(&spHandler);
spStm.Query(spHandler);
Assert(spStm);
return spStm->Save(pStm, fClearDirty);
}
STDMETHODIMP CDMVComponentData::GetSizeMax
(
ULARGE_INTEGER *pcbSize
)
{
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
SPIPersistStreamInit spStm;
m_spNodeMgr->GetRootNode(&spNode);
spNode->GetHandler(&spHandler);
spStm.Query(spHandler);
Assert(spStm);
return spStm->GetSizeMax(pcbSize);
}
STDMETHODIMP CDMVComponentData::InitNew()
{
SPITFSNode spNode;
SPITFSNodeHandler spHandler;
SPIPersistStreamInit spStm;
m_spNodeMgr->GetRootNode(&spNode);
spNode->GetHandler(&spHandler);
spStm.Query(spHandler);
Assert(spStm);
return spStm->InitNew();
}
HRESULT CDMVComponentData::FinalConstruct()
{
HRESULT hr = hrOK;
hr = CComponentData::FinalConstruct();
if (FHrSucceeded(hr))
{
m_spTFSComponentData->GetNodeMgr(&m_spNodeMgr);
}
return hr;
}
void CDMVComponentData::FinalRelease()
{
CComponentData::FinalRelease();
}