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

388 lines
11 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
basertr.cpp
Base Router handler implementation.
FILE HISTORY:
*/
#include "stdafx.h"
#include "util.h"
#include "basertr.h"
#include "basecon.h"
#include "tfschar.h"
#include "strmap.h" // XXXtoCString functions
#include "service.h" // TFS service APIs
#include "rtrstr.h" // const strings used
#include "rtrsheet.h" // RtrPropertySheet
#include "rtrutil.h"
/*---------------------------------------------------------------------------
BaseRouterHandler implementation
---------------------------------------------------------------------------*/
BaseRouterHandler::BaseRouterHandler(ITFSComponentData *pCompData)
: CHandler(pCompData),
m_nHelpTopicId(IDS_DEFAULT_HELP_TOPIC)
{
// Initialize all of the buttons to be hidden by default
for (int i=0; i<MMC_VERB_COUNT; i++)
{
m_rgButtonState[i] = HIDDEN;
m_bState[i] = FALSE;
}
// Make sure that these constants don't change on us
Assert((0x8000+MMC_VERB_OPEN_INDEX) == MMC_VERB_OPEN);
Assert((0x8000+MMC_VERB_COPY_INDEX) == MMC_VERB_COPY);
Assert((0x8000+MMC_VERB_PASTE_INDEX) == MMC_VERB_PASTE);
Assert((0x8000+MMC_VERB_DELETE_INDEX) == MMC_VERB_DELETE);
Assert((0x8000+MMC_VERB_PROPERTIES_INDEX) == MMC_VERB_PROPERTIES);
Assert((0x8000+MMC_VERB_RENAME_INDEX) == MMC_VERB_RENAME);
Assert((0x8000+MMC_VERB_REFRESH_INDEX) == MMC_VERB_REFRESH);
Assert((0x8000+MMC_VERB_PRINT_INDEX) == MMC_VERB_PRINT);
m_verbDefault = MMC_VERB_OPEN;
}
/*---------------------------------------------------------------------------
BaseRouterHandler::OnCreateNodeId2
Returns a unique string for this node
Author: WeiJiang
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnCreateNodeId2(ITFSNode * pNode, CString & strId,
DWORD * dwFlags)
{
const GUID * pGuid = pNode->GetNodeType();
CString strProviderId, strGuid;
StringFromGUID2(*pGuid, strGuid.GetBuffer(256), 256);
strGuid.ReleaseBuffer();
// RouterInfo should be available now
Assert(m_spRouterInfo);
DWORD RouterInfoFlags = m_spRouterInfo->GetFlags();
// if the machine is added not as local, then we use the machine name
if (0 == (RouterInfoFlags & RouterInfo_AddedAsLocal)) // not added as local
strId = m_spRouterInfo->GetMachineName() + strGuid;
else
strId = strGuid;
return hrOK;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::OnResultSelect
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnResultSelect(ITFSComponent *pComponent,
LPDATAOBJECT pDataObject,
MMC_COOKIE cookie,
LPARAM arg,
LPARAM lParam)
{
SPIConsoleVerb spConsoleVerb;
SPITFSNode spNode;
HRESULT hr = hrOK;
CORg( pComponent->GetConsoleVerb(&spConsoleVerb) );
CORg( m_spNodeMgr->FindNode(cookie, &spNode) );
// If you need to update the verb state, do it here
EnableVerbs(spConsoleVerb);
Error:
return hr;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::EnableVerbs
-
Author: KennT
---------------------------------------------------------------------------*/
void BaseRouterHandler::EnableVerbs(IConsoleVerb *pConsoleVerb)
{
Assert(pConsoleVerb);
Assert(DimensionOf(m_rgButtonState) == DimensionOf(m_bState));
Assert(DimensionOf(m_rgButtonState) == MMC_VERB_COUNT);
for (int i=0; i<DimensionOf(m_rgButtonState); i++)
{
if (m_rgButtonState[i] & HIDDEN)
{
pConsoleVerb->SetVerbState(INDEX_TO_VERB(i), HIDDEN, TRUE);
}
else
{
// unhide this button before enabling
pConsoleVerb->SetVerbState(INDEX_TO_VERB(i), HIDDEN, FALSE);
pConsoleVerb->SetVerbState(INDEX_TO_VERB(i), ENABLED, m_bState[i]);
}
}
pConsoleVerb->SetDefaultVerb(m_verbDefault);
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::OnResultPropertyChange
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnResultPropertyChange
(
ITFSComponent * pComponent,
LPDATAOBJECT pDataObject,
MMC_COOKIE cookie,
LPARAM arg,
LPARAM param
)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
SPITFSNode spNode;
m_spNodeMgr->FindNode(cookie, &spNode);
RtrPropertySheet * pPropSheet = reinterpret_cast<RtrPropertySheet *>(param);
LONG_PTR changeMask = 0;
// tell the property page to do whatever now that we are back on the
// main thread
pPropSheet->OnPropertyChange(TRUE, &changeMask);
pPropSheet->AcknowledgeNotify();
if (changeMask)
spNode->ChangeNode(changeMask);
return hrOK;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::OnPropertyChange
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnPropertyChange
(
ITFSNode *pNode,
LPDATAOBJECT pDataObject,
DWORD dwType,
LPARAM arg,
LPARAM param
)
{
// This is running on the MAIN THREAD!
// ----------------------------------------------------------------
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
RtrPropertySheet * pPropSheet = reinterpret_cast<RtrPropertySheet *>(param);
LONG_PTR changeMask = 0;
// tell the property page to do whatever now that we are back on the
// main thread
pPropSheet->OnPropertyChange(TRUE, &changeMask);
pPropSheet->AcknowledgeNotify();
if (changeMask)
pNode->ChangeNode(changeMask);
return hrOK;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::OnVerbRefresh
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnVerbRefresh(ITFSNode *pNode, LPARAM arg, LPARAM lParam)
{
return ForceGlobalRefresh(m_spRouterInfo);
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::OnResultRefresh
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnResultRefresh(ITFSComponent *pTFSComponent, LPDATAOBJECT lpDataObject, MMC_COOKIE cookie, LPARAM arg, LPARAM lParam)
{
return ForceGlobalRefresh(m_spRouterInfo);
}
HRESULT BaseRouterHandler::ForwardCommandToParent(ITFSNode *pNode,
long nCommandId,
DATA_OBJECT_TYPES type,
LPDATAOBJECT pDataObject,
DWORD dwType)
{
SPITFSNode spParent;
SPITFSNodeHandler spHandler;
HRESULT hr = hrOK;
CORg( pNode->GetParent(&spParent) );
if (!spParent)
CORg( E_INVALIDARG );
CORg( spParent->GetHandler(&spHandler) );
if (!spHandler)
CORg( E_INVALIDARG );
hr = spHandler->OnCommand(spParent, nCommandId, type, pDataObject, dwType);
Error:
return hr;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::EnumDynamicExtensions
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::EnumDynamicExtensions(ITFSNode * pNode)
{
HRESULT hr = hrOK;
CORg (m_dynExtensions.SetNode(pNode->GetNodeType()));
CORg (m_dynExtensions.Reset());
CORg (m_dynExtensions.Load());
Error:
return hr;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::EnumDynamicExtensions
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::AddDynamicNamespaceExtensions(ITFSNode * pNode)
{
HRESULT hr = hrOK;
CGUIDArray aNamespace;
SPIConsoleNameSpace spNS;
int i;
COM_PROTECT_TRY
{
// enumerate dynamic namespace extensions
CORg (m_spNodeMgr->GetConsoleNameSpace(&spNS));
m_dynExtensions.GetNamespaceExtensions(aNamespace);
for (i = 0; i < aNamespace.GetSize(); i++)
{
HRESULT hrAdd = spNS->AddExtension(pNode->GetData(TFS_DATA_SCOPEID), &aNamespace[i]);
if (FAILED(hrAdd))
Trace1("BaseRouterHandler::AddDynamicNamespaceExtensions - AddExtension failed %x", hrAdd);
}
COM_PROTECT_ERROR_LABEL;
}
COM_PROTECT_CATCH
return hr;
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::OnResultContextHelp
-
Author: MikeG (a-migall)
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::OnResultContextHelp(ITFSComponent * pComponent,
LPDATAOBJECT pDataObject,
MMC_COOKIE cookie,
LPARAM arg,
LPARAM lParam)
{
// Not used...
UNREFERENCED_PARAMETER(pDataObject);
UNREFERENCED_PARAMETER(cookie);
UNREFERENCED_PARAMETER(arg);
UNREFERENCED_PARAMETER(lParam);
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return HrDisplayHelp(pComponent, m_spTFSCompData->GetHTMLHelpFileName(), m_nHelpTopicId);
}
/*!--------------------------------------------------------------------------
BaseRouterHandler::AddArrayOfMenuItems
-
Author: KennT
---------------------------------------------------------------------------*/
HRESULT BaseRouterHandler::AddArrayOfMenuItems(ITFSNode *pNode,
const SRouterNodeMenu *prgMenu,
UINT crgMenu,
LPCONTEXTMENUCALLBACK pCallback,
long iInsertionAllowed,
INT_PTR pUserData)
{
HRESULT hr = hrOK;
ULONG ulFlags;
UINT i;
CString stMenu;
// Now go through and add our menu items
for (i=0; i<crgMenu; i++)
{
// If this type of insertion is not allowed, skip it
if ( (iInsertionAllowed & (1L << (prgMenu[i].m_ulPosition & CCM_INSERTIONPOINTID_MASK_FLAGINDEX))) == 0 )
continue;
if (prgMenu[i].m_sidMenu == IDS_MENU_SEPARATOR)
{
ulFlags = MF_SEPARATOR;
stMenu.Empty();
}
else
{
if (prgMenu[i].m_pfnGetMenuFlags)
{
ulFlags = (*prgMenu[i].m_pfnGetMenuFlags)(prgMenu+i,
pUserData);
}
else
ulFlags = 0;
// Special case - if the menu flags returns 0xFFFFFFFF
// then we interpret this to mean don't add the menu item
if (ulFlags == 0xFFFFFFFF)
continue;
stMenu.Empty();
if (prgMenu[i].m_sidMenu)
stMenu.LoadString(prgMenu[i].m_sidMenu);
}
LoadAndAddMenuItem(pCallback,
stMenu,
prgMenu[i].m_sidMenu,
prgMenu[i].m_ulPosition,
ulFlags,
prgMenu[i].m_pszLangIndStr);
}
return hr;
}