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.
|
|
// 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
|