Leaked source code of windows server 2003
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.
 
 
 
 
 
 

600 lines
15 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000 - 2001.
//
// File: Basecont.cpp
//
// Contents:
//
// History: 07-26-2001 Hiteshr Created
//
//----------------------------------------------------------------------------
#include "headers.h"
/******************************************************************************
Class: CBaseLeafNode
Purpose: BaseNode class for all the non container object. A node is a node in
snapins tree listview.
******************************************************************************/
CBaseLeafNode::
CBaseLeafNode(CRoleComponentDataObject * pComponentDataObject,
CAdminManagerNode* pAdminManagerNode,
CBaseAz* pBaseAz)
:CBaseNode(pComponentDataObject,
pAdminManagerNode,
pBaseAz)
{
SetDisplayName(GetBaseAzObject()->GetName());
}
CBaseLeafNode::
~CBaseLeafNode()
{
}
LPCWSTR
CBaseLeafNode::
GetString(int nCol)
{
CBaseAz * pBaseAz = GetBaseAzObject();
ASSERT(pBaseAz);
//Name
if(nCol == 0)
return pBaseAz->GetName();
//Type
if( nCol == 1)
return pBaseAz->GetType();
if( nCol == 2)
return pBaseAz->GetDescription();
ASSERT(FALSE);
return NULL;
}
int
CBaseLeafNode::
GetImageIndex(BOOL /*bOpenImage*/)
{
return GetBaseAzObject()->GetImageIndex();
}
BOOL
CBaseLeafNode::
OnSetDeleteVerbState(DATA_OBJECT_TYPES ,
BOOL* pbHide,
CNodeList* pNodeList)
{
if(!pbHide || !pNodeList)
{
ASSERT(pbHide);
ASSERT(pNodeList);
return FALSE;
}
CBaseAz* pBaseAz = GetBaseAzObject();
ASSERT(pBaseAz);
BOOL bWrite = FALSE;
HRESULT hr = pBaseAz->IsWritable(bWrite);
if(FAILED(hr) || !bWrite || pNodeList->GetCount() > 1)
{
*pbHide = TRUE;
return FALSE;
}
else
{
*pbHide = FALSE;
return TRUE;
}
}
BOOL
CBaseLeafNode::
CanCloseSheets()
{
//This function is called when there are open property sheets,
//and operation cannot be done without closing them.
::DisplayInformation(NULL,
IDS_CLOSE_CONTAINER_PROPERTY_SHEETS,
GetDisplayName());
return FALSE;
}
void
CBaseLeafNode::
OnDelete(CComponentDataObject* pComponentData,
CNodeList* pNodeList)
{
GenericDeleteRoutine(this,pComponentData,pNodeList,TRUE);
}
BOOL
CBaseLeafNode::
HasPropertyPages(DATA_OBJECT_TYPES /*type*/,
BOOL* pbHideVerb,
CNodeList* pNodeList)
{
if (!pNodeList || !pbHideVerb)
{
ASSERT(pNodeList);
ASSERT(pbHideVerb);
return FALSE;
}
if (pNodeList->GetCount() == 1) // single selection
{
*pbHideVerb = FALSE; // always show the verb
return TRUE;
}
// Multiple selection
*pbHideVerb = TRUE;
return FALSE;
}
HRESULT
CBaseLeafNode::
CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle,
CNodeList* pNodeList)
{
if(!lpProvider || !pNodeList)
{
ASSERT(lpProvider);
ASSERT(pNodeList);
return E_POINTER;
}
if(!CanReadOneProperty(GetDisplayName(),
GetBaseAzObject()))
return E_FAIL;
HRESULT hr = S_OK;
if (pNodeList->GetCount() > 1)
{
return hr;
}
CRolePropertyPageHolder* pHolder = NULL;
UINT nCountOfPages = 0;
do
{
CComponentDataObject* pComponentDataObject = GetComponentDataObject();
ASSERT(pComponentDataObject);
pHolder = new CRolePropertyPageHolder(GetContainer(),
this,
pComponentDataObject);
if(!pHolder)
{
hr = E_OUTOFMEMORY;
break;
}
//Add Property Pages
while(1)
{
hr = AddOnePageToList(pHolder, nCountOfPages);
if(hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
{
hr = S_OK;
break;
}
if(FAILED(hr))
{
break;
}
nCountOfPages++;
}
BREAK_ON_FAIL_HRESULT(hr);
if(nCountOfPages)
{
return pHolder->CreateModelessSheet(lpProvider, handle);
}
}while(0);
if(FAILED(hr) || !nCountOfPages)
{
if(pHolder)
delete pHolder;
}
return hr;
}
void
CBaseLeafNode
::OnPropertyChange(CComponentDataObject* pComponentData,
BOOL bScopePane,
long changeMask)
{
if(!pComponentData)
{
ASSERT(pComponentData);
return;
}
SetDisplayName(GetBaseAzObject()->GetName());
CTreeNode::OnPropertyChange(pComponentData,
bScopePane,
changeMask);
}
/******************************************************************************
Class: CGroupNode
Purpose: Snapin Node for Application Group Object
******************************************************************************/
DEBUG_DECLARE_INSTANCE_COUNTER(CGroupNode)
CGroupNode::
CGroupNode(CRoleComponentDataObject * pComponentDataObject,
CAdminManagerNode* pAdminManagerNode,
CBaseAz* pBaseAz,
CRoleAz* pRoleAz)
:CBaseLeafNode(pComponentDataObject,pAdminManagerNode,
pBaseAz),
m_pRoleAz(pRoleAz)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CGroupNode);
}
CGroupNode
::~CGroupNode()
{
DEBUG_DECREMENT_INSTANCE_COUNTER(CGroupNode)
}
HRESULT
CGroupNode::
AddOnePageToList(CRolePropertyPageHolder *pHolder, UINT nPageNumber)
{
HRESULT hr = S_OK;
if(!pHolder)
{
ASSERT(pHolder);
return E_POINTER;
}
if(nPageNumber == 0)
{
//Add General Property Page
CGroupGeneralPropertyPage * pGenPropPage =
new CGroupGeneralPropertyPage(GetBaseAzObject(),this);
if(!pGenPropPage)
{
return E_OUTOFMEMORY;
}
pHolder->AddPageToList(pGenPropPage);
return hr;
}
//Get the type of grou[
CGroupAz* pGroupAz = static_cast<CGroupAz*>(GetBaseAzObject());
LONG lGroupType;
hr = pGroupAz->GetGroupType(&lGroupType);
if(FAILED(hr))
{
return hr;
}
if((lGroupType == AZ_GROUPTYPE_BASIC) && (nPageNumber == 1 || nPageNumber == 2))
{
//Add member/non-member page
CGroupMemberPropertyPage * pGroupMemberPropertyPage =
new CGroupMemberPropertyPage(GetBaseAzObject(),this,
(nPageNumber == 1) ? IDD_GROUP_MEMBER : IDD_GROUP_NON_MEMBER,
(nPageNumber == 1) ? TRUE : FALSE);
if(!pGroupMemberPropertyPage)
{
return E_OUTOFMEMORY;
}
pHolder->AddPageToList(pGroupMemberPropertyPage);
return hr;
}
if((lGroupType == AZ_GROUPTYPE_LDAP_QUERY) && (nPageNumber == 1))
{
//Add LDAP Query Property Page
CGroupQueryPropertyPage * pQueryPropPage =
new CGroupQueryPropertyPage(GetBaseAzObject(),this);
if(!pQueryPropPage)
{
hr = E_OUTOFMEMORY;
return hr;
}
pHolder->AddPageToList(pQueryPropPage);
return hr;
}
return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
}
HRESULT
CGroupNode::
DeleteAssociatedBaseAzObject()
{
TRACE_METHOD_EX(DEB_SNAPIN,CGroupNode,DeleteAssociatedBaseAzObject)
HRESULT hr = S_OK;
//If m_pRoleAz is present, this group node is used to
//represent a member of Role. On delete delete it from
//Role Membership. Else delete this object which is done
//by base class delete
CBaseAz* pBaseAz = GetBaseAzObject();
if(!m_pRoleAz)
{
CContainerAz* pContainerAzParent = GetBaseAzObject()->GetParentAz();
if(!pContainerAzParent)
{
ASSERT(pContainerAzParent);
return E_UNEXPECTED;
}
hr = pContainerAzParent->DeleteAzObject(pBaseAz->GetObjectType(),
pBaseAz->GetName());
}
else
{
//Remove this group from Role Membership
hr = m_pRoleAz->RemoveMember(AZ_PROP_ROLE_APP_MEMBERS,
pBaseAz);
if(SUCCEEDED(hr))
{
hr = m_pRoleAz->Submit();
}
}
return hr;
}
void
CGroupNode::
OnDelete(CComponentDataObject* pComponentData,
CNodeList* pNodeList)
{
GenericDeleteRoutine(this,
pComponentData,
pNodeList,
!m_pRoleAz); //Don't ask for confirmation when removing group from a role
}
/******************************************************************************
Class: CTaskNode
Purpose: Snapin Node for Task Object
******************************************************************************/
DEBUG_DECLARE_INSTANCE_COUNTER(CTaskNode)
CTaskNode::
CTaskNode(CRoleComponentDataObject * pComponentDataObject,
CAdminManagerNode* pAdminManagerNode,
CBaseAz* pBaseAz)
:CBaseLeafNode(pComponentDataObject,
pAdminManagerNode,
pBaseAz)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CTaskNode);
}
CTaskNode
::~CTaskNode()
{
DEBUG_DECREMENT_INSTANCE_COUNTER(CTaskNode)
}
HRESULT
CTaskNode::
AddOnePageToList(CRolePropertyPageHolder *pHolder, UINT nPageNumber)
{
HRESULT hr = S_OK;
if(!pHolder)
{
ASSERT(pHolder);
return E_POINTER;
}
CTaskAz* pTaskAz = dynamic_cast<CTaskAz*>(GetBaseAzObject());
ASSERT(pTaskAz);
if(nPageNumber == 0)
{
//Set the Title to "Node_Name Definition Properties"
pHolder->SetSheetTitle(IDS_FMT_PROP_SHEET_TITILE_FOR_ROLE_DEFINITION,
this);
//Add General Property Page
CTaskGeneralPropertyPage * pGenPropPage =
new CTaskGeneralPropertyPage(GetBaseAzObject(),
this,
pTaskAz->IsRoleDefinition());
if(!pGenPropPage)
{
hr = E_OUTOFMEMORY;
return hr;
}
pHolder->AddPageToList(pGenPropPage);
return hr;
}
else if(nPageNumber == 1)
{
//Add Definition Property Page
CTaskDefinitionPropertyPage * pDefinitionPropPage =
new CTaskDefinitionPropertyPage(pTaskAz,
this,
pTaskAz->IsRoleDefinition());
if(!pDefinitionPropPage)
{
hr = E_OUTOFMEMORY;
return hr;
}
pHolder->AddPageToList(pDefinitionPropPage);
return hr;
}
return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
}
/******************************************************************************
Class: COperationNode
Purpose: Snapin Node for Operation Object
******************************************************************************/
DEBUG_DECLARE_INSTANCE_COUNTER(COperationNode)
COperationNode::
COperationNode(CRoleComponentDataObject * pComponentDataObject,
CAdminManagerNode* pAdminManagerNode,
CBaseAz* pBaseAz)
:CBaseLeafNode(pComponentDataObject,
pAdminManagerNode,
pBaseAz)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(COperationNode)
}
COperationNode
::~COperationNode()
{
DEBUG_DECREMENT_INSTANCE_COUNTER(COperationNode)
}
HRESULT
COperationNode::
AddOnePageToList(CRolePropertyPageHolder *pHolder, UINT nPageNumber)
{
HRESULT hr = S_OK;
if(!pHolder)
{
ASSERT(pHolder);
return E_POINTER;
}
if(nPageNumber == 0)
{
//Set the Title to "Node_Name Definition Properties"
pHolder->SetSheetTitle(IDS_FMT_PROP_SHEET_TITILE_FOR_ROLE_DEFINITION,
this);
//
//Add General Property Page
//
COperationGeneralPropertyPage * pGenPropPage =
new COperationGeneralPropertyPage(GetBaseAzObject(),this);
if(!pGenPropPage)
{
hr = E_OUTOFMEMORY;
return hr;
}
pHolder->AddPageToList(pGenPropPage);
return hr;
}
return HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS);
}
/******************************************************************************
Class: CSidCacheNode
Purpose: Snapin Node for Windows Users/Groups which are represented by SID
******************************************************************************/
DEBUG_DECLARE_INSTANCE_COUNTER(CSidCacheNode)
CSidCacheNode::
CSidCacheNode(CRoleComponentDataObject * pComponentDataObject,
CAdminManagerNode* pAdminManagerNode,
CBaseAz* pBaseAz,
CRoleAz* pRoleAz)
:CBaseLeafNode(pComponentDataObject,
pAdminManagerNode,
pBaseAz),
m_pRoleAz(pRoleAz)
{
DEBUG_INCREMENT_INSTANCE_COUNTER(CSidCacheNode)
ASSERT(m_pRoleAz);
}
CSidCacheNode::~CSidCacheNode()
{
DEBUG_DECREMENT_INSTANCE_COUNTER(CSidCacheNode)
}
HRESULT
CSidCacheNode::
DeleteAssociatedBaseAzObject()
{
TRACE_METHOD_EX(DEB_SNAPIN,CSidCacheNode,DeleteAssociatedBaseAzObject)
CBaseAz* pBaseAz = GetBaseAzObject();
HRESULT hr = m_pRoleAz->RemoveMember(AZ_PROP_ROLE_MEMBERS,
pBaseAz);
if(SUCCEEDED(hr))
{
hr = m_pRoleAz->Submit();
}
return hr;
}
void
CSidCacheNode::
OnDelete(CComponentDataObject* pComponentData,
CNodeList* pNodeList)
{
GenericDeleteRoutine(this,pComponentData,pNodeList,FALSE);
}
BOOL
CSidCacheNode::
OnSetDeleteVerbState(DATA_OBJECT_TYPES ,
BOOL* pbHide,
CNodeList* pNodeList)
{
if(!pbHide || !pNodeList)
{
ASSERT(pbHide);
ASSERT(pNodeList);
return FALSE;
}
BOOL bWrite = FALSE;
HRESULT hr = m_pRoleAz->IsWritable(bWrite);
if(FAILED(hr) || !bWrite || pNodeList->GetCount() > 1)
{
*pbHide = TRUE;
return FALSE;
}
else
{
*pbHide = FALSE;
return TRUE;
}
}
BOOL
CSidCacheNode::
HasPropertyPages(DATA_OBJECT_TYPES /*type*/,
BOOL* pbHideVerb,
CNodeList* /*pNodeList*/)
{
if(!pbHideVerb)
{
ASSERT(pbHideVerb);
return FALSE;
}
*pbHideVerb = TRUE;
return FALSE;
}