WindowsXP-SP1/admin/snapin/domain/domobj.cpp
2020-09-30 16:53:49 +02:00

963 lines
24 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: domobj.cpp
//
//--------------------------------------------------------------------------
#include "stdafx.h"
#include "domobj.h"
#include "domobjui.h"
#include "cdomain.h"
#include "domain.h"
#include "proppage.h"
#include "notify.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///////////////////////////////////////////////////////////////////////
// global helper functions
int _MessageBox(HWND hWnd, // handle to owner window
LPCTSTR lpText, // pointer to text in message box
UINT uType) // style of message box
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString szCaption;
szCaption.LoadString(AFX_IDS_APP_TITLE);
return ::MessageBox(hWnd, lpText, szCaption, uType);
}
void ReportError(HWND hWnd, UINT nMsgID, HRESULT hr)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
LPTSTR ptzSysMsg = NULL;
int cch = 0;
int retval = MB_OK;
// load message for this HRESULT
cch = cchLoadHrMsg( hr, &ptzSysMsg, TRUE );
CString szError;
if (cch == 0)
{
// could not get a message string, format the raw hr value
CString s;
s.LoadString(IDS_FAILURE_UNK);
szError.Format((LPCWSTR)s, hr);
}
else
{
szError = ptzSysMsg;
}
// format message string with
CString szFmt;
szFmt.LoadString(nMsgID);
CString szMsg;
szMsg.Format((LPCWSTR)szFmt, (LPCWSTR)szError);
_MessageBox(hWnd, szMsg, MB_OK|MB_ICONERROR);
// cleanup
if (NULL != ptzSysMsg)
LocalFree(ptzSysMsg);
}
///////////////////////////////////////////////////////////////////////
//CDsUiWizDLL g_dsUiWizDLL;
enum
{
// Identifiers for each of the commands to be inserted into the context menu.
IDM_MANAGE,
IDM_TRUST_WIZ,
IDM_RETARGET,
IDM_EDIT_FSMO,
IDM_DOMAIN_VERSION,
IDM_FOREST_VERSION
};
HRESULT _AddMenuItemHelper(IContextMenuCallback* pIContextMenuCallback,
UINT nResourceID, // contains text and status text seperated by '\n'
long lCommandID,
long lInsertionPointID,
long fFlags = 0,
long fSpecialFlags = 0)
{
ASSERT( pIContextMenuCallback != NULL );
// load the resource
CString strText;
strText.LoadString(nResourceID);
ASSERT( !strText.IsEmpty() );
// split the resource into the menu text and status text
CString strStatusText;
int iSeparator = strText.Find(_T('\n'));
if (0 > iSeparator)
{
ASSERT( FALSE );
strStatusText = strText;
}
else
{
strStatusText = strText.Right( strText.GetLength()-(iSeparator+1) );
strText = strText.Left( iSeparator );
}
// add the menu item
USES_CONVERSION;
CONTEXTMENUITEM contextmenuitem;
::ZeroMemory( &contextmenuitem, sizeof(contextmenuitem) );
contextmenuitem.strName = T2OLE(const_cast<LPTSTR>((LPCTSTR)strText));
contextmenuitem.strStatusBarText = T2OLE(const_cast<LPTSTR>((LPCTSTR)strStatusText));
contextmenuitem.lCommandID = lCommandID;
contextmenuitem.lInsertionPointID = lInsertionPointID;
contextmenuitem.fFlags = fFlags;
contextmenuitem.fSpecialFlags = fSpecialFlags;
HRESULT hr = pIContextMenuCallback->AddItem( &contextmenuitem );
ASSERT(hr == S_OK);
return hr;
}
///////////////////////////////////////////////////////////////////////
// CDomainTreeBrowser
HRESULT CDomainTreeBrowser::Bind(MyBasePathsInfo* pInfo)
{
TRACE(L"CDomainTreeBrowser::Bind()\n");
ASSERT(pInfo != NULL);
_Reset();
HRESULT hr = S_OK;
// create a browse object
hr = ::CoCreateInstance(CLSID_DsDomainTreeBrowser,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDsBrowseDomainTree,
(LPVOID*)&m_spIDsBrowseDomainTree);
if (FAILED(hr))
{
TRACE(L"CoCreateInstance(CLSID_DsDomainTreeBrowser, ...) failed with hr = 0x%x\n");
goto error;
}
// set the target computer
hr = m_spIDsBrowseDomainTree->SetComputer(pInfo->GetServerName(), NULL, NULL);
TRACE(L"m_spIDsBrowseDomainTree->SetComputer(%s, NULL, NULL) returned hr = 0x%x\n",
pInfo->GetServerName(), hr);
if (FAILED(hr))
goto error;
ASSERT(SUCCEEDED(hr));
return hr; // all was fine
error:
// things went wrong, clear all
_Reset();
return hr;
}
HRESULT CDomainTreeBrowser::GetData()
{
ASSERT(m_spIDsBrowseDomainTree != NULL);
HRESULT hr = S_OK;
PDOMAIN_TREE pNewDomains = NULL;
m_spIDsBrowseDomainTree->FlushCachedDomains();
DWORD dwFlags = DBDTF_RETURNFQDN;
hr = m_spIDsBrowseDomainTree->GetDomains(&pNewDomains, dwFlags);
TRACE(L"m_spIDsBrowseDomainTree->GetDomains(...) returned hr = 0x%x\n", hr);
if (SUCCEEDED(hr) && (pNewDomains != NULL))
{
_FreeDomains();
m_pDomains = pNewDomains;
}
return hr;
}
///////////////////////////////////////////////////////////////////////
// CFolderObject
CFolderObject::~CFolderObject()
{
RemoveAllChildren();
}
BOOL CFolderObject::AddChild(CFolderObject* pChildFolderObject)
{
return (m_childList.AddTail(pChildFolderObject) != NULL);
}
void CFolderObject::RemoveAllChildren()
{
while (!m_childList.IsEmpty())
delete m_childList.RemoveHead();
}
void CFolderObject::IncrementSheetLockCount()
{
++m_nSheetLockCount;
if (m_pParentFolder != NULL)
m_pParentFolder->IncrementSheetLockCount();
}
void CFolderObject::DecrementSheetLockCount()
{
ASSERT(m_nSheetLockCount > 0);
--m_nSheetLockCount;
if (m_pParentFolder != NULL)
m_pParentFolder->DecrementSheetLockCount();
}
BOOL CFolderObject::_WarningOnSheetsUp(CComponentDataImpl* pCD)
{
if (!IsSheetLocked())
return FALSE; // no warning, all is cool
// warning to user that oeration cannot be performed
AfxMessageBox(IDS_SHEETS_UP_DELETE, MB_OK);
ASSERT(FALSE);
// need to bring sheets on the foreground
pCD->GetCookieSheet()->BringToForeground(this, pCD);
return TRUE;
}
///////////////////////////////////////////////////////////////////////
// CRootFolderObject
CRootFolderObject::CRootFolderObject(CComponentDataImpl* pCD) :
m_pEnterpriseRoot(NULL)
{
m_pCD = pCD;
}
HRESULT CRootFolderObject::Bind()
{
return m_domainTreeBrowser.Bind(m_pCD->GetBasePathsInfo());
}
HRESULT CRootFolderObject::GetData()
{
HRESULT hr = m_domainTreeBrowser.GetData();
if (FAILED(hr))
return hr;
// firs time, try to load the domain icon
VERIFY(SUCCEEDED(m_pCD->AddDomainIcon()));
RemoveAllChildren(); // clear the UI structures
return hr;
}
HRESULT CRootFolderObject::EnumerateRootFolder(CComponentDataImpl* pComponentData)
{
TRACE(L"CRootFolderObject::EnumerateRootFolder()\n");
if (!m_domainTreeBrowser.HasData())
{
TRACE(L"m_domainTreeBrowser.HasData() == FALSE \n");
return S_OK;
}
HRESULT hr = S_OK;
MyBasePathsInfo * pBPI;
//
// Get the enterprise root domain DN from the RootDSE.
//
pBPI = pComponentData->GetBasePathsInfo();
if (!pBPI)
{
ASSERT(FALSE);
return E_FAIL;
}
PCWSTR pwzRoot = pBPI->GetRootDomainNamingContext();
TRACE(L"Root path: %ws\n", pwzRoot);
PDOMAIN_DESC pRootDomain = NULL;
//
// Insert the root nodes. First insert the enterprise root.
//
for (pRootDomain = m_domainTreeBrowser.GetDomainTree()->aDomains; pRootDomain;
pRootDomain = pRootDomain->pdNextSibling)
{
if (_wcsicmp(pwzRoot, pRootDomain->pszNCName) == 0)
{
TRACE(L"Enterprise root found!\n");
CDomainObject* pDomain = new CDomainObject;
if (!pDomain)
{
ASSERT(FALSE);
return E_OUTOFMEMORY;
}
pDomain->Initialize(pRootDomain, m_pCD->GetDomainImageIndex());
AddChild(pDomain);
pDomain->SetParentFolder(this);
hr = pComponentData->AddFolder(pDomain, GetScopeID(), TRUE); // has children
if (FAILED(hr))
{
return hr;
}
//
// Create a non-refcounted reference to the enterprise root domain node.
// Do NOT call delete on the m_pEnterpriseRoot pointer!
//
m_pEnterpriseRoot = pDomain;
break;
}
}
//
// Now insert the rest of the root nodes.
//
for (pRootDomain = m_domainTreeBrowser.GetDomainTree()->aDomains; pRootDomain;
pRootDomain = pRootDomain->pdNextSibling)
{
if (_wcsicmp(pwzRoot, pRootDomain->pszNCName) == 0)
{
// Root already inserted.
continue;
}
CDomainObject* pDomain = new CDomainObject;
if (!pDomain)
{
ASSERT(FALSE);
return E_OUTOFMEMORY;
}
pDomain->Initialize(pRootDomain, m_pCD->GetDomainImageIndex());
AddChild(pDomain);
pDomain->SetParentFolder(this);
hr = pComponentData->AddFolder(pDomain, GetScopeID(), TRUE); // has children
if (FAILED(hr))
{
break;
}
}
return hr;
}
HRESULT
CRootFolderObject::EnumerateFolder(CFolderObject* pFolderObject,
HSCOPEITEM pParent,
CComponentDataImpl* pComponentData)
{
HRESULT hr = E_FAIL;
if (!m_domainTreeBrowser.HasData())
return hr;
ASSERT(pFolderObject != NULL);
ASSERT(pFolderObject->GetScopeID() == pParent);
CDomainObject* pDomainObject = dynamic_cast<CDomainObject*>(pFolderObject);
if (pDomainObject == NULL)
return hr;
DOMAIN_DESC* pDomainDesc = pDomainObject->GetDescriptionPtr();
if (pDomainDesc == NULL)
return hr;
if (pDomainDesc->pdChildList == NULL)
return S_OK;
for (DOMAIN_DESC* pChild = pDomainDesc->pdChildList; pChild;
pChild = pChild->pdNextSibling)
{
CDomainObject* pDomain = new CDomainObject;
pDomain->Initialize(pChild,
m_pCD->GetDomainImageIndex());
hr = pComponentData->AddFolder(pDomain, pDomainObject->GetScopeID(),
TRUE); // has children
pFolderObject->AddChild(pDomain);
pDomain->SetParentFolder(pFolderObject);
if (FAILED(hr))
break;
} // for
return hr;
}
HRESULT CRootFolderObject::OnAddMenuItems(LPCONTEXTMENUCALLBACK pContextMenuCallback,
long *pInsertionAllowed)
{
HRESULT hr = S_OK;
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
/*
if (g_dsUiWizDLL.Load())
{
return _AddMenuItemHelper(pContextMenuCallback, IDS_COMMAND_TRUST_WIZ, IDM_TRUST_WIZ, CCM_INSERTIONPOINTID_PRIMARY_TOP);
}
*/
_AddMenuItemHelper(pContextMenuCallback, IDS_COMMAND_RETARGET, IDM_RETARGET, CCM_INSERTIONPOINTID_PRIMARY_TOP);
_AddMenuItemHelper(pContextMenuCallback, IDS_COMMAND_EDIT_FSMO, IDM_EDIT_FSMO, CCM_INSERTIONPOINTID_PRIMARY_TOP);
_AddMenuItemHelper(pContextMenuCallback, IDS_COMMAND_FOREST_VER, IDM_FOREST_VERSION, CCM_INSERTIONPOINTID_PRIMARY_TOP);
}
return hr;
}
HRESULT CRootFolderObject::OnCommand(CComponentDataImpl* pCD, long nCommandID)
{
HRESULT hr = S_OK;
CString strConfig, strPartitions, strSchema;
switch (nCommandID)
{
//case IDM_TRUST_WIZ:
// OnDomainTrustWizard();
// break;
case IDM_RETARGET:
OnRetarget();
break;
case IDM_EDIT_FSMO:
OnEditFSMO();
break;
case IDM_FOREST_VERSION:
MyBasePathsInfo * pBPI;
pBPI = pCD->GetBasePathsInfo();
if (!pBPI)
{
ASSERT(FALSE);
return E_FAIL;
}
pBPI->GetConfigPath(strConfig);
pBPI->GetPartitionsPath(strPartitions);
pBPI->GetSchemaPath(strSchema);
HWND hWndParent;
pCD->GetMainWindow(&hWndParent);
CDomainObject* pRoot;
pRoot = GetEnterpriseRootNode();
if (!pRoot)
{
ASSERT(FALSE);
return E_FAIL;
}
DSPROP_ForestVersionDlg(strConfig, strPartitions, strSchema,
pRoot->GetDomainName(), hWndParent);
break;
default:
ASSERT(FALSE); // Unknown command!
hr = E_FAIL;
}
return hr;
}
//void CRootFolderObject::OnDomainTrustWizard()
//{
//g_dsUiWizDLL.TrustWizard();
//}
void CRootFolderObject::OnRetarget()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
if (_WarningOnSheetsUp(m_pCD))
return;
HWND hWndParent;
m_pCD->GetMainWindow(&hWndParent);
CComPtr<IDsAdminChooseDC> spIDsAdminChooseDC;
CComBSTR bstrSelectedDC;
HRESULT hr = ::CoCreateInstance(CLSID_DsAdminChooseDCObj,
NULL,
CLSCTX_INPROC_SERVER,
IID_IDsAdminChooseDC,
(void **) &spIDsAdminChooseDC);
if (FAILED(hr))
{
::ReportError(hWndParent, IDS_CANT_GET_PARTITIONS_INFORMATION, hr);
return;
}
// invoke the dialog
hr = spIDsAdminChooseDC->InvokeDialog(hWndParent,
m_pCD->GetBasePathsInfo()->GetDomainName(),
m_pCD->GetBasePathsInfo()->GetServerName(),
0x0,
&bstrSelectedDC);
if (SUCCEEDED(hr) && (hr != S_FALSE))
{
TRACE(L"CChangeDCDialog returned IDOK, with dlg.GetNewDCName() = %s\n", bstrSelectedDC);
// attempt to bind
MyBasePathsInfo tempBasePathsInfo;
{
CWaitCursor wait;
hr = tempBasePathsInfo.InitFromName(bstrSelectedDC);
}
TRACE(L"tempBasePathsInfo.GetServerName() == %s\n", tempBasePathsInfo.GetServerName());
if (FAILED(hr))
{
TRACE(L"tempBasePathsInfo.InitFromName(bstrSelectedDC) failed with hr = 0x%x\n", hr);
ReportError(hWndParent, IDS_CANT_GET_PARTITIONS_INFORMATION, hr);
// TODO: error handling, change icon
}
else
{
m_pCD->GetBasePathsInfo()->InitFromInfo(&tempBasePathsInfo);
m_pCD->SetInit();
TRACE(L"m_pCD->GetBasePathsInfo()->GetServerName() == %s\n", m_pCD->GetBasePathsInfo()->GetServerName());
hr = m_pCD->GetDsDisplaySpecOptionsCFHolder()->Init(m_pCD->GetBasePathsInfo());
ASSERT(SUCCEEDED(hr));
{
CWaitCursor wait;
m_pCD->OnRefreshVerbHandler(this, NULL, TRUE /*bBindAgain */);
}
} // if
} // if
}
void CRootFolderObject::OnEditFSMO()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HWND hWndParent;
m_pCD->GetMainWindow(&hWndParent);
CComPtr<IDisplayHelp> spIDisplayHelp;
HRESULT hr = m_pCD->m_pConsole->QueryInterface (IID_IDisplayHelp,
(void **)&spIDisplayHelp);
ASSERT(spIDisplayHelp != NULL);
CEditFsmoDialog dlg(m_pCD->GetBasePathsInfo(), hWndParent, spIDisplayHelp);
dlg.DoModal();
}
HRESULT CRootFolderObject::OnAddPages(LPPROPERTYSHEETCALLBACK lpProvider,
LONG_PTR handle)
{
CUpnSuffixPropertyPage* pPage = new CUpnSuffixPropertyPage();
HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(&pPage->m_psp);
return lpProvider->AddPage(hPage);
}
///////////////////////////////////////////////////////////////////////
// CDomainObject
CDomainObject::~CDomainObject()
{
if (m_bSecondary)
{
ASSERT(m_pDomainDescription != NULL);
::free(m_pDomainDescription);
}
}
LPCTSTR CDomainObject::GetDisplayString(int nCol)
{
switch (nCol)
{
case 0:
return GetDomainName();
case 1:
return GetClass();
default:
ASSERT(FALSE);
} // switch
return _T("");
}
void CDomainObject::Initialize(DOMAIN_DESC* pDomainDescription,
int nImage,
BOOL bHasChildren)
{
SetImageIndex(nImage);
// save pointer to domain description in DOMAIN_TREE
m_pDomainDescription = pDomainDescription;
}
void CDomainObject::InitializeForSecondaryPage(LPCWSTR pszNCName,
LPCWSTR pszObjectClass,
int nImage)
{
ASSERT(pszNCName != NULL);
ASSERT(pszObjectClass != NULL);
SetImageIndex(nImage);
// standalone node, need to build a dummy DOMAIN_DESC
m_bSecondary = TRUE;
// allocate and zero memory
int nNCNameLen = lstrlen(pszNCName)+1;
int nObjectClassLen = lstrlen(pszObjectClass)+1;
int nByteLen = sizeof(DOMAIN_DESC) + sizeof(WCHAR)*(nNCNameLen + nObjectClassLen);
m_pDomainDescription = (DOMAIN_DESC*)::malloc(nByteLen);
ASSERT(m_pDomainDescription);
if (!m_pDomainDescription)
{
return;
}
::ZeroMemory(m_pDomainDescription, nByteLen);
// copy the strings
m_pDomainDescription->pszNCName = (WCHAR*) (((BYTE*)m_pDomainDescription) + sizeof(DOMAIN_DESC));
wcscpy(m_pDomainDescription->pszNCName, pszNCName);
m_pDomainDescription->pszObjectClass = (WCHAR*) (((BYTE*)m_pDomainDescription->pszNCName) + sizeof(WCHAR)*nNCNameLen);
wcscpy(m_pDomainDescription->pszObjectClass, pszObjectClass);
}
HRESULT CDomainObject::OnAddMenuItems(LPCONTEXTMENUCALLBACK pContextMenuCallback,
long *pInsertionAllowed)
{
HRESULT hr = S_OK;
if (*pInsertionAllowed & CCM_INSERTIONALLOWED_TOP)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hr = _AddMenuItemHelper(pContextMenuCallback, IDS_COMMAND_MANAGE, IDM_MANAGE, CCM_INSERTIONPOINTID_PRIMARY_TOP);
if (FAILED(hr))
return hr;
hr = _AddMenuItemHelper(pContextMenuCallback, IDS_COMMAND_DOMAIN_VER, IDM_DOMAIN_VERSION, CCM_INSERTIONPOINTID_PRIMARY_TOP);
if (FAILED(hr))
return hr;
}
return hr;
}
HRESULT CDomainObject::OnCommand(CComponentDataImpl* pCD, long nCommandID)
{
HRESULT hr = S_OK;
CString strPath;
switch (nCommandID)
{
case IDM_MANAGE:
OnManage(pCD);
break;
//case IDM_TRUST_WIZ:
// OnDomainTrustWizard(pCD);
// break;
case IDM_DOMAIN_VERSION:
HWND hWndParent;
MyBasePathsInfo * pBPI;
pBPI = pCD->GetBasePathsInfo();
if (!pBPI)
{
ASSERT(FALSE);
return E_FAIL;
}
pCD->GetMainWindow(&hWndParent);
// build an LDAP path out of the DN
if (PdcAvailable())
{
strPath = L"LDAP://";
strPath += GetPDC();
strPath += L"/";
strPath += GetNCName();
}
else
{
pBPI->ComposeADsIPath(strPath, GetNCName());
}
DSPROP_DomainVersionDlg(strPath, GetDomainName(), hWndParent);
break;
default:
ASSERT(FALSE); // Unknown command!
hr = E_FAIL;
}
return hr;
}
void CDomainObject::OnManage(CComponentDataImpl* pCD)
{
static LPCWSTR lpszSearchArr[] =
{
L"%userprofile%\\Application Data\\Microsoft\\AdminTools\\dsa.msc",
L"%systemroot%\\system32\\dsa.msc",
NULL
};
WCHAR szParamString[MAX_PATH];
WCHAR szFileName[MAX_PATH];
wcscpy (szParamString, L" /Domain=");
wcscat (szParamString, (LPWSTR)(GetDomainName()));
SHELLEXECUTEINFO seiManage = {0};
seiManage.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI;
seiManage.cbSize = sizeof (SHELLEXECUTEINFO);
seiManage.lpParameters = (LPCWSTR)&szParamString;
seiManage.nShow = SW_SHOW;
BOOL bExecuted = FALSE;
DWORD dwErr = 0;
for (int k=0; lpszSearchArr[k] != NULL; k++)
{
CWaitCursor cWait;
seiManage.lpFile = (LPCWSTR)lpszSearchArr[k];
if (!ShellExecuteEx(&seiManage))
{
dwErr = ::GetLastError();
}
else
{
bExecuted = TRUE;
break;
}
}
if (!bExecuted)
{
HWND hWndParent;
pCD->GetMainWindow(&hWndParent);
ReportError(hWndParent, IDS_ERROR_MANAGE, HRESULT_FROM_WIN32(dwErr));
}
}
//void CDomainObject::OnDomainTrustWizard(CComponentDataImpl* pCD)
//{
//g_dsUiWizDLL.TrustWizard();
//}
void CDomainObject::SetPdcAvailable(bool fAvail)
{
_fPdcAvailable = fAvail;
}
////////////////////////////////////////////////////////////////////
// CCookieTableBase
#define NUMBER_OF_COOKIE_TABLE_ENTRIES 4 // default count, expandable at run time
CCookieTableBase::CCookieTableBase() :
m_pCookieArr(NULL)
{
m_nEntries = NUMBER_OF_COOKIE_TABLE_ENTRIES;
m_pCookieArr =(CFolderObject**)malloc(m_nEntries*sizeof(CFolderObject*));
ASSERT(m_pCookieArr);
if (m_pCookieArr)
{
ZeroMemory(m_pCookieArr, m_nEntries*sizeof(CFolderObject*));
}
}
CCookieTableBase::~CCookieTableBase()
{
if (m_pCookieArr)
{
free(m_pCookieArr);
}
}
void CCookieTableBase::Add(CFolderObject* pCookie)
{
ASSERT(!IsPresent(pCookie));
if (!m_pCookieArr)
{
return;
}
UINT nFreeSlot = m_nEntries;
for (UINT k=0; k<m_nEntries; k++)
{
if (m_pCookieArr[k] == NULL)
{
m_pCookieArr[k] = pCookie;
return;
}
}
// no space left, need to allocate
int nAlloc = m_nEntries*2;
m_pCookieArr = (CFolderObject**)realloc(m_pCookieArr, sizeof(CFolderObject*)*nAlloc);
ASSERT(m_pCookieArr);
if (m_pCookieArr)
{
::ZeroMemory(&m_pCookieArr[m_nEntries], sizeof(CFolderObject*)*m_nEntries);
m_pCookieArr[m_nEntries] = pCookie;
m_nEntries = nAlloc;
}
}
BOOL CCookieTableBase::Remove(CFolderObject* pCookie)
{
if (!m_pCookieArr)
{
return FALSE;
}
for (UINT k=0; k<m_nEntries; k++)
{
if (m_pCookieArr[k] == pCookie)
{
m_pCookieArr[k] = NULL;
return TRUE; // found
}
}
return FALSE; // not found
}
BOOL CCookieTableBase::IsPresent(CFolderObject* pCookie)
{
if (!m_pCookieArr)
{
return FALSE;
}
for (UINT k=0; k<m_nEntries; k++)
{
if (m_pCookieArr[k] == pCookie)
return TRUE;
}
return FALSE;
}
void CCookieTableBase::Reset()
{
if (!m_pCookieArr)
{
return;
}
for (UINT k=0; k<m_nEntries; k++)
{
m_pCookieArr[k] = NULL;
}
}
UINT CCookieTableBase::GetCount()
{
if (!m_pCookieArr)
{
return 0;
}
UINT nCount = 0;
for (UINT k=0; k<m_nEntries; k++)
{
if (m_pCookieArr[k] != NULL)
nCount++;
}
return nCount;
}
////////////////////////////////////////////////////////////////////
// CDSCookieSheetTable
void CCookieSheetTable::BringToForeground(CFolderObject* pCookie, CComponentDataImpl* pCD)
{
ASSERT(pCD != NULL);
ASSERT(pCookie != NULL);
if (!m_pCookieArr)
{
return;
}
// look for the cookie itself and for all the cookies that have the
// given cookie as parent or ancestor
BOOL bActivate = TRUE;
for (UINT k=0; k<m_nEntries; k++)
{
if (m_pCookieArr[k] != NULL)
{
CFolderObject* pAncestorCookie = m_pCookieArr[k];
while (pAncestorCookie != NULL)
{
if (pAncestorCookie == pCookie)
{
CString szADSIPath;
LPCWSTR lpszNamingContext = ((CDomainObject *)m_pCookieArr[k])->GetNCName();
pCD->GetBasePathsInfo()->ComposeADsIPath(szADSIPath, lpszNamingContext);
// the first one will be also activated
VERIFY(BringSheetToForeground((LPWSTR)(LPCWSTR)szADSIPath, bActivate));
if (bActivate)
bActivate = !bActivate;
}
pAncestorCookie = pAncestorCookie->GetParentFolder();
} // while
} // if
} // for
}
///////////////////////////////////////////////////////////////////////
// CDsUiWizDLL