334 lines
9.4 KiB
C++
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
|