windows-nt/Source/XPSP1/NT/admin/admt/updatemot/srcsidupdate.cpp
2020-09-26 16:20:57 +08:00

334 lines
9.4 KiB
C++

// SrcSidUpdate.cpp : Implementation of CSrcSidUpdate
#include "stdafx.h"
#include "UpdateMOT.h"
#include "SrcSidUpdate.h"
#include "IntroDlg.h"
#include "DomainListDlg.h"
#include "ProgressDlg.h"
#include "SummaryDlg.h"
#import "DBMgr.tlb" no_namespace,named_guids
#import "VarSet.tlb" no_namespace , named_guids rename("property", "aproperty")
/////////////////////////////////////////////////////////////////////////////
// CSrcSidUpdate
STDMETHODIMP CSrcSidUpdate::QueryForSrcSidColumn(VARIANT_BOOL *pbFound)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
HRESULT hr = S_OK;
try
{
IIManageDBPtr pDB(CLSID_IManageDB);
//see if column is already in the database
*pbFound = pDB->SrcSidColumnInMigratedObjectsTable();
}
catch(_com_error& e)
{
hr = e.Error();
}
catch(...)
{
hr = E_FAIL;
}
return hr;
}
STDMETHODIMP CSrcSidUpdate::CreateSrcSidColumn(VARIANT_BOOL bHide, VARIANT_BOOL *pbCreated)
{
HRESULT hr = S_OK;
BOOL bAgain = TRUE; //flag used to redo upon cancel
AFX_MANAGE_STATE(AfxGetStaticModuleState())
//retrieve a list of domains from the MigratedObjects table
hr = FillDomainListFromMOT();
if ( FAILED(hr) )
{
*pbCreated = VARIANT_FALSE;
return E_FAIL;
}
//if the MOT is empty, just add the new column without the GUI
if (domainList.IsEmpty())
{
try
{
IIManageDBPtr pDB(CLSID_IManageDB);
//create the new column in the MigratedObjects table
hr = pDB->raw_CreateSrcSidColumnInMOT(pbCreated);
if ( FAILED(hr) )
*pbCreated = VARIANT_FALSE; //column not created
else
*pbCreated = VARIANT_TRUE; //column is created
}//end try
catch(_com_error& e)
{
hr = e.Error();
}
catch(...)
{
hr = E_FAIL;
}
return hr;
}
//if hide the GUI, try populating for all domains in the MOT
if (bHide)
{
try
{
IIManageDBPtr pDB(CLSID_IManageDB);
//create the new column in the MigratedObjects table
hr = pDB->raw_CreateSrcSidColumnInMOT(pbCreated);
if ( FAILED(hr) )
{
*pbCreated = VARIANT_FALSE;
return hr;
}
*pbCreated = VARIANT_TRUE; //column is created
CString domainName;
POSITION pos = domainList.GetHeadPosition();
//while we have domains to process, populate that domain
while (pos != NULL)
{
//get the next domain name
domainName = domainList.GetNext(pos);
//populate the new column for this domain
pDB->PopulateSrcSidColumnByDomain(domainName.AllocSysString(), L"");
}
}//end try
catch(_com_error& e)
{
hr = e.Error();
}
catch(...)
{
hr = E_FAIL;
}
return hr;
}//end if hide
//display the intro dialog
CIntroDlg introDlg;
if (introDlg.DoModal() == IDCANCEL)
{
*pbCreated = VARIANT_FALSE;
return S_OK;
}
//do atleast once and again if cancel on the progress dialog
while (bAgain)
{
bAgain = FALSE; //clear flag so we don't do this again
//pass the list to the dialog for display
CDomainListDlg domainListDlg;
domainListDlg.SetDomainListPtr(&domainList);
domainListDlg.SetExcludeListPtr(&excludeList);
//now display the domain selection dialog
if (domainListDlg.DoModal() == IDCANCEL)
{
*pbCreated = VARIANT_FALSE;
return S_OK;
}
try
{
IIManageDBPtr pDB(CLSID_IManageDB);
//create the new column in the MigratedObjects table
hr = pDB->raw_CreateSrcSidColumnInMOT(pbCreated);
if ( FAILED(hr) )
{
*pbCreated = VARIANT_FALSE;
return hr;
}
*pbCreated = VARIANT_TRUE; //column is created
//display the progress dialog
CProgressDlg progressDlg;
progressDlg.Create();
progressDlg.ShowWindow(SW_SHOW);
progressDlg.SetIncrement((int)(domainList.GetCount())); //init the progress dialog
CString domainName;
VARIANT_BOOL bPopulated;
POSITION pos = domainList.GetHeadPosition();
//process dialog's messages (looking specifically for Cancel message)
progressDlg.CheckForCancel();
//while we have domains to process and user has not canceled,
//process each domain and control the progress dialog
while ((pos != NULL) && (!progressDlg.Canceled()))
{
//get the next domain name
domainName = domainList.GetNext(pos);
//set the domain name on the progress dialog
progressDlg.SetDomain(domainName);
CWaitCursor wait; //Put up a wait cursor
//populate the new column for this domain
bPopulated = pDB->PopulateSrcSidColumnByDomain(domainName.AllocSysString(), L"");
wait.~CWaitCursor();//remove the wait cursor
//if populate of the column was successful, add the domain
//name to the populate list
if (bPopulated)
populatedList.AddTail(domainName);
//process dialog's messages (looking specifically for Cancel message)
progressDlg.CheckForCancel();
//increment the progress dialog regardless of success
if (pos == NULL)
{
progressDlg.Done();
progressDlg.DestroyWindow();
}
else
progressDlg.Increment();
}
//if canceled, delete the new column, clear the lists, and
//start over
if (progressDlg.Canceled())
{
//remove the column and return to the domain list dialog
VARIANT_BOOL bDeleted = pDB->DeleteSrcSidColumnInMOT();
//reinitalize the lists
ReInitializeLists();
bAgain = TRUE; //set flag to try again
}
}//end try
catch(_com_error& e)
{
hr = e.Error();
}
catch(...)
{
hr = E_FAIL;
}
}//end while cancel
//display the summary dialog
CSummaryDlg summaryDlg;
summaryDlg.SetDomainListPtr(&domainList);
summaryDlg.SetExcludeListPtr(&excludeList);
summaryDlg.SetPopulatedListPtr(&populatedList);
summaryDlg.DoModal();
return hr;
}
/*********************************************************************
* *
* Written by: Paul Thompson *
* Date: 18 AUG 2000 *
* *
* This protected member function of the CSrcSidUpdate class is *
* responsible for adding domains from the Protar database's *
* MigratedObjects table into the domain list. *
* *
*********************************************************************/
//BEGIN FillDomainListFromMOT
HRESULT CSrcSidUpdate::FillDomainListFromMOT()
{
/* local variables */
HRESULT hr = S_OK;
IUnknown * pUnk = NULL;
long ndx, numObjects;
_bstr_t srcDom;
CString domainName;
POSITION currentPos;
WCHAR strKey[MAX_PATH];
/* function body */
try
{
IVarSetPtr pVarSet(CLSID_VarSet);
IIManageDBPtr pDB(CLSID_IManageDB);
hr = pVarSet->QueryInterface(IID_IUnknown,(void**)&pUnk);
if ( SUCCEEDED(hr) )
{
//get all migrated objects into a varset
hr = pDB->raw_GetMigratedObjectsFromOldMOT(-1,&pUnk);
}
if ( SUCCEEDED(hr) )
{
pVarSet = pUnk;
pUnk->Release();
numObjects = pVarSet->get(L"MigratedObjects");
//for each migrated object, save its source domain in the list
for ( ndx = 0; ndx < numObjects; ndx++ )
{
//get the source domain name
swprintf(strKey,L"MigratedObjects.%ld.%s",ndx,L"SourceDomain");
srcDom = pVarSet->get(strKey);
//add the name to the list, if not already in it
domainName = (WCHAR*)srcDom;
currentPos = domainList.Find(domainName);
if (currentPos == NULL)
domainList.AddTail(domainName);
}
}//end if got objects
}
catch(_com_error& e)
{
hr = e.Error();
}
catch(...)
{
hr = E_FAIL;
}
return hr;
}//END FillDomainListFromMOT
/*********************************************************************
* *
* Written by: Paul Thompson *
* Date: 22 AUG 2000 *
* *
* This protected member function of the CDomainListDlg class is *
* responsible for taking the domain names out of the excluded list *
* and placing it back into the domain list. *
* *
*********************************************************************/
//BEGIN ReInitializeLists
void CSrcSidUpdate::ReInitializeLists()
{
/* local variables */
POSITION currentPos; //current position in the list
CString domainName; //name of domain from the list
/* function body */
currentPos = excludeList.GetHeadPosition();
while (currentPos != NULL)
{
domainName = excludeList.GetNext(currentPos);
domainList.AddTail(domainName);
}
excludeList.RemoveAll();
populatedList.RemoveAll();
}
//END ReInitializeLists