644 lines
15 KiB
C++
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();
|
|
}
|
|
|
|
|
|
|