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.
 
 
 
 
 
 

1117 lines
32 KiB

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1998 - 1999
//
// File: connectui.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#include <SnapBase.h>
#include "resource.h"
#include "connection.h"
#include "connectionui.h"
#include <aclpage.h>
#ifdef DEBUG_ALLOCATOR
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#endif
////////////////////////////////////////////////////////////////////////////////
extern LPCWSTR g_lpszGC;
extern LPCWSTR g_lpszLDAP;
extern LPCWSTR g_lpszRootDSE;
///////////////////////////////////////////////////////////////////////////////
BEGIN_MESSAGE_MAP(CADSIEditConnectDialog, CDialog)
//{{AFX_MSG_MAP(CADsObjectDialog)
ON_CBN_SELCHANGE(IDC_NC_BOX, OnSelChangeContextList)
ON_CBN_SELCHANGE(IDC_DOMAIN_SERVER_BOX, OnSelChangeDSList)
ON_CBN_SELCHANGE(IDC_DN_BOX, OnSelChangeDNList)
ON_CBN_EDITCHANGE(IDC_DOMAIN_SERVER_BOX, OnEditChangeDSList)
ON_CBN_EDITCHANGE(IDC_DN_BOX, OnEditChangeDNList)
ON_BN_CLICKED(IDC_DN_RADIO, OnDNRadio)
ON_BN_CLICKED(IDC_NC_RADIO, OnNCRadio)
ON_BN_CLICKED(IDC_DOMAIN_SERVER_RADIO, OnDSRadio)
ON_BN_CLICKED(IDC_DEFAULT_RADIO, OnDefaultRadio)
ON_BN_CLICKED(IDC_ADVANCED_BUTTON, OnAdvanced)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CADSIEditConnectDialog::CADSIEditConnectDialog(CContainerNode* pRootnode,
CTreeNode* pTreeNode,
CComponentDataObject* pComponentData,
CConnectionData* pConnectData
) : CDialog(IDD_CONNECTION_DIALOG)
{
m_pContainerNode = pRootnode;
m_pTreeNode = pTreeNode;
m_pComponentData = pComponentData;
m_pNewConnectData = pConnectData;
m_szDisplayExtra = L"";
m_sDefaultServerName = L"";
}
CADSIEditConnectDialog::~CADSIEditConnectDialog()
{
if (m_bNewConnect && m_pNewConnectData != NULL)
delete m_pNewConnectData;
}
BOOL CADSIEditConnectDialog::OnInitDialog()
{
CDialog::OnInitDialog();
CConnectionData* pConnectData = GetConnectionData();
if (pConnectData == NULL)
{
m_pNewConnectData = new CConnectionData();
if (m_pNewConnectData)
{
m_bNewConnect = TRUE;
CString sServerName;
m_pNewConnectData->GetDomainServer(sServerName);
if (sServerName == L"")
{
HRESULT hr = CConnectionData::GetServerNameFromDefault(m_pNewConnectData);
if (SUCCEEDED(hr))
{
m_pNewConnectData->GetDomainServer(m_sDefaultServerName);
}
}
m_pNewConnectData->GetDomainServer(m_szDisplayExtra);
}
}
else
{
m_pNewConnectData = pConnectData;
m_bNewConnect = FALSE;
}
LoadNamingContext();
SetupUI();
SetDirty();
return TRUE;
}
void CADSIEditConnectDialog::LoadNamingContext()
{
CComboBox* pcNCBox = (CComboBox*)GetDlgItem(IDC_NC_BOX);
// NOTICE-2002/03/01-artm CString can throw out of memory exception,
// but that needs to be handled at a higher level so don't worry about
// it here.
m_szDomain.LoadString(IDS_DOMAIN_NC);
m_szConfigContainer.LoadString(IDS_CONFIG_CONTAINER);
m_szRootDSE.LoadString(IDS_ROOTDSE);
m_szSchema.LoadString(IDS_SCHEMA);
pcNCBox->AddString(m_szDomain);
pcNCBox->AddString(m_szConfigContainer);
pcNCBox->AddString(m_szRootDSE);
pcNCBox->AddString(m_szSchema);
}
void CADSIEditConnectDialog::SetupUI()
{
CComboBox* pcDNBox = (CComboBox*)GetDlgItem(IDC_DN_BOX);
CComboBox* pcNCBox = (CComboBox*)GetDlgItem(IDC_NC_BOX);
CComboBox* pcDomainServerBox = (CComboBox*)GetDlgItem(IDC_DOMAIN_SERVER_BOX);
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CButton* pcNCRadio = (CButton*)GetDlgItem(IDC_NC_RADIO);
CButton* pcDSRadio = (CButton*)GetDlgItem(IDC_DOMAIN_SERVER_RADIO);
CButton* pcDefaultRadio = (CButton*)GetDlgItem(IDC_DEFAULT_RADIO);
CEdit* pcNameBox = (CEdit*)GetDlgItem(IDC_CONNECTION_NAME);
//Setup UI to reflect data
LoadMRUs();
CString sDistinguishedName;
m_pNewConnectData->GetDistinguishedName(sDistinguishedName);
if (!sDistinguishedName.IsEmpty())
{
int iIndex = pcDNBox->FindStringExact(-1, sDistinguishedName);
if (iIndex != CB_ERR)
{
pcDNBox->SetCurSel(iIndex);
}
else
{
int nIndex = pcDNBox->AddString(sDistinguishedName);
pcDNBox->SetCurSel(nIndex);
}
OnSelChangeDNList();
pcDNRadio->SetCheck(BST_CHECKED);
}
else
{
CString sNamingContext;
m_pNewConnectData->GetNamingContext(sNamingContext);
int iIndex = pcNCBox->FindStringExact(-1, sNamingContext);
if (iIndex != CB_ERR)
{
pcNCBox->SetCurSel(iIndex);
}
else
{
pcNCBox->SetCurSel(0);
}
OnSelChangeContextList();
pcNCRadio->SetCheck(BST_CHECKED);
}
CString sServer;
m_pNewConnectData->GetDomainServer(sServer);
BOOL bUserDefinedServer;
bUserDefinedServer = m_pNewConnectData->GetUserDefinedServer();
if (!sServer.IsEmpty() && bUserDefinedServer)
{
int iIndex = pcDomainServerBox->FindStringExact(-1, sServer);
if (iIndex != CB_ERR)
{
pcDomainServerBox->SetCurSel(iIndex);
}
else
{
int nIndex = pcDomainServerBox->AddString(sServer);
pcDomainServerBox->SetCurSel(nIndex);
}
OnSelChangeDSList();
pcDSRadio->SetCheck(BST_CHECKED);
}
else
{
pcDefaultRadio->SetCheck(BST_CHECKED);
}
CString sName;
m_pNewConnectData->GetName(sName);
pcNameBox->SetLimitText(MAX_CONNECT_NAME_LENGTH);
if (sName.IsEmpty())
{
if (pcNCRadio->GetCheck())
{
CString szNCName;
pcNCBox->GetLBText(pcNCBox->GetCurSel(), szNCName);
pcNameBox->SetWindowText(szNCName);
m_pNewConnectData->GetDomainServer(m_szDisplayExtra);
}
else
{
CString szMyConnection;
// NOTICE-2002/03/01-artm CString can throw out of memory exception,
// but that needs to be handled at a higher level so don't worry about
// it here.
szMyConnection.LoadString(IDS_MY_CONNECTION);
pcNameBox->SetWindowText(szMyConnection);
}
}
else
{
pcNameBox->SetWindowText(sName);
}
SetAndDisplayPath();
}
void CADSIEditConnectDialog::LoadMRUs()
{
CComboBox* pcDomainServerBox = (CComboBox*)GetDlgItem(IDC_DOMAIN_SERVER_BOX);
CComboBox* pcDNBox = (CComboBox*)GetDlgItem(IDC_DN_BOX);
CADSIEditRootData* pRootNode = GetRootNode();
CStringList sServerMRU, sDNMRU;
pRootNode->GetServerMRU(&sServerMRU);
pRootNode->GetDNMRU(&sDNMRU);
POSITION pos = sServerMRU.GetHeadPosition();
while (pos != NULL)
{
CString sMRU;
sMRU = sServerMRU.GetNext(pos);
pcDomainServerBox->AddString(sMRU);
}
pos = sDNMRU.GetHeadPosition();
while (pos != NULL)
{
CString sMRU;
sMRU = sDNMRU.GetNext(pos);
pcDNBox->AddString(sMRU);
}
}
void CADSIEditConnectDialog::SaveMRUs()
{
CADSIEditRootData* pRootNode = GetRootNode();
CStringList sDNMRU, sServerMRU;
CString sDS, sDN;
BOOL bFound = FALSE;
m_pNewConnectData->GetDistinguishedName(sDN);
m_pNewConnectData->GetDomainServer(sDS);
pRootNode->GetServerMRU(&sServerMRU);
pRootNode->GetDNMRU(&sDNMRU);
POSITION pos = sServerMRU.GetHeadPosition();
while (pos != NULL)
{
CString sServer;
sServer = sServerMRU.GetNext(pos);
if (sServer == sDS)
{
bFound = TRUE;
break;
}
}
if (!bFound && !sDS.IsEmpty())
{
sServerMRU.AddHead(sDS);
pRootNode->SetServerMRU(&sServerMRU);
}
bFound = FALSE;
pos = sDNMRU.GetHeadPosition();
while (pos != NULL)
{
CString sDistinguishedName;
sDistinguishedName = sDNMRU.GetNext(pos);
if (sDistinguishedName == sDN)
{
bFound = TRUE;
break;
}
}
if (!bFound && !sDN.IsEmpty())
{
sDNMRU.AddHead(sDN);
pRootNode->SetDNMRU(&sDNMRU);
}
}
void CADSIEditConnectDialog::OnDNRadio()
{
SetDirty();
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnNCRadio()
{
SetDirty();
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnDSRadio()
{
CComboBox* pcDomainServerBox = (CComboBox*)GetDlgItem(IDC_DOMAIN_SERVER_BOX);
CString szDS;
pcDomainServerBox->GetWindowText(szDS);
m_pNewConnectData->SetDomainServer(szDS);
m_pNewConnectData->SetUserDefinedServer(TRUE);
SetDirty();
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnDefaultRadio()
{
m_pNewConnectData->SetUserDefinedServer(FALSE);
if (m_pNewConnectData->IsGC())
{
m_pNewConnectData->SetDomainServer(L"");
}
else
{
m_pNewConnectData->SetDomainServer(m_sDefaultServerName);
}
SetDirty();
SetAndDisplayPath();
}
void CADSIEditConnectDialog::SetAndDisplayPath()
{
CEdit* pcPathBox = (CEdit*)GetDlgItem(IDC_FULLPATH_BOX);
CButton* pcDSRadio = (CButton*)GetDlgItem(IDC_DOMAIN_SERVER_RADIO);
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CComboBox* pcNCBox = (CComboBox*)GetDlgItem(IDC_NC_BOX);
// Get data from connection node
//
CString szLDAP, sServer, sPort, sDistinguishedName, sNamingContext;
m_pNewConnectData->GetLDAP(szLDAP);
m_pNewConnectData->GetDomainServer(sServer);
m_pNewConnectData->GetPort(sPort);
m_pNewConnectData->GetDistinguishedName(sDistinguishedName);
m_pNewConnectData->GetNamingContext(sNamingContext);
m_pNewConnectData->SetRootDSE(FALSE);
CString szFullPath;
if (!sServer.IsEmpty())
{
szFullPath = szFullPath + sServer;
if (!sPort.IsEmpty())
{
szFullPath = szFullPath + _T(":") + sPort + _T("/");
}
else
{
szFullPath = szFullPath + _T("/");
}
}
if (pcDNRadio->GetCheck() && !sDistinguishedName.IsEmpty())
{
szFullPath = szFullPath + sDistinguishedName;
// NOTICE-2002/03/01-artm Both strings always null terminated, wcscmp() okay.
// sDistinguishedName is a CString and g_lpszRootDSE is a constant.
if (wcscmp(sDistinguishedName, g_lpszRootDSE) == 0)
{
m_pNewConnectData->SetRootDSE(TRUE);
}
}
else
{
szFullPath = szFullPath + sNamingContext;
// NOTICE-2002/03/01-artm Both strings always null terminated, wcscmp() okay.
// sNamingContext is a CString and g_lpszRootDSE is a constant.
if (wcscmp(sNamingContext, g_lpszRootDSE) == 0)
{
m_pNewConnectData->SetRootDSE(TRUE);
}
}
m_pNewConnectData->GetDomainServer(m_szDisplayExtra);
m_szDisplayExtra = L" [" + m_szDisplayExtra + L"]";
szFullPath = szLDAP + szFullPath;
pcPathBox->SetWindowText(szFullPath);
}
void CADSIEditConnectDialog::OnSelChangeContextList()
{
CComboBox* pcNCBox = (CComboBox*)GetDlgItem(IDC_NC_BOX);
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CButton* pcNCRadio = (CButton*)GetDlgItem(IDC_NC_RADIO);
CEdit* pcNameBox = (CEdit*)GetDlgItem(IDC_CONNECTION_NAME);
CString szContext;
SetDirty();
pcNCBox->GetLBText(pcNCBox->GetCurSel(), szContext);
m_pNewConnectData->SetNamingContext(szContext);
pcNCRadio->SetCheck(BST_CHECKED);
pcDNRadio->SetCheck(BST_UNCHECKED);
CString sName;
pcNCBox->GetLBText(pcNCBox->GetCurSel(), sName);
pcNameBox->SetWindowText(sName);
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnSelChangeDSList()
{
CComboBox* pcDomainServerBox = (CComboBox*)GetDlgItem(IDC_DOMAIN_SERVER_BOX);
CButton* pcDSRadio = (CButton*)GetDlgItem(IDC_DOMAIN_SERVER_RADIO);
CButton* pcDefaultRadio = (CButton*)GetDlgItem(IDC_DEFAULT_RADIO);
SetDirty();
if (pcDomainServerBox->GetCount() > 0)
{
CString sServer;
pcDomainServerBox->GetLBText(pcDomainServerBox->GetCurSel(), sServer);
m_pNewConnectData->SetDomainServer(sServer);
m_pNewConnectData->SetUserDefinedServer(TRUE);
}
pcDSRadio->SetCheck(BST_CHECKED);
pcDefaultRadio->SetCheck(BST_UNCHECKED);
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnSelChangeDNList()
{
CComboBox* pcDNBox = (CComboBox*)GetDlgItem(IDC_DN_BOX);
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CButton* pcNCRadio = (CButton*)GetDlgItem(IDC_NC_RADIO);
SetDirty();
if (pcDNBox->GetCount() > 0)
{
CString sDistinguishedName;
pcDNBox->GetLBText(pcDNBox->GetCurSel(), sDistinguishedName);
m_pNewConnectData->SetDistinguishedName(sDistinguishedName);
}
pcDNRadio->SetCheck(BST_CHECKED);
pcNCRadio->SetCheck(BST_UNCHECKED);
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnEditChangeDSList()
{
CComboBox* pcDomainServerBox = (CComboBox*)GetDlgItem(IDC_DOMAIN_SERVER_BOX);
CButton* pcDSRadio = (CButton*)GetDlgItem(IDC_DOMAIN_SERVER_RADIO);
CButton* pcDefaultRadio = (CButton*)GetDlgItem(IDC_DEFAULT_RADIO);
SetDirty();
CString szDS, sOldDS;
pcDomainServerBox->GetWindowText(szDS);
m_pNewConnectData->SetDomainServer(szDS);
pcDSRadio->SetCheck(BST_CHECKED);
pcDefaultRadio->SetCheck(BST_UNCHECKED);
SetAndDisplayPath();
m_pNewConnectData->SetUserDefinedServer(TRUE);
}
void CADSIEditConnectDialog::OnEditChangeDNList()
{
CComboBox* pcDNBox = (CComboBox*)GetDlgItem(IDC_DN_BOX);
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CButton* pcNCRadio = (CButton*)GetDlgItem(IDC_NC_RADIO);
SetDirty();
CString s, sOldDN;
pcDNBox->GetWindowText(s);
m_pNewConnectData->SetDistinguishedName(s);
pcDNRadio->SetCheck(BST_CHECKED);
pcNCRadio->SetCheck(BST_UNCHECKED);
SetAndDisplayPath();
}
void CADSIEditConnectDialog::OnAdvanced()
{
CWaitCursor cursor;
CThemeContextActivator activator;
CADSIEditRootData* pRootNode = GetRootNode();
CADSIEditAdvancedConnectionDialog AdvancedDialog(NULL,
pRootNode,
m_pComponentData,
m_pNewConnectData);
if (AdvancedDialog.DoModal() == IDOK)
{
cursor.Restore();
if (m_pNewConnectData->IsGC() && !m_pNewConnectData->GetUserDefinedServer())
{
m_pNewConnectData->SetDomainServer(L"");
}
else if (!m_pNewConnectData->IsGC())
{
CConnectionData::GetServerNameFromDefault(m_pNewConnectData);
}
SetDirty();
SetAndDisplayPath();
}
}
void CADSIEditConnectDialog::OnOK()
{
if (OnApply())
{
CDialog::OnOK();
}
}
BOOL CADSIEditConnectDialog::OnApply()
{
CEdit* pcNameBox = (CEdit*)GetDlgItem(IDC_CONNECTION_NAME);
CADSIEditRootData* pRootNode = GetRootNode();
ASSERT(pRootNode != NULL);
CComponentDataObject* pComponentData = GetComponentData();
BSTR bstrPath;
CString sName;
pcNameBox->GetWindowText(sName);
m_pNewConnectData->SetName(sName);
if (m_bDirty)
{
if (!DoDirty())
{
return FALSE;
}
}
else
{
if (pRootNode->GetDisplayName() != sName)
{
pRootNode->SetDisplayName(sName + m_szDisplayExtra);
}
else
{
ADSIEditMessageBox(IDS_MSG_CONNECTION_NAME, MB_OK);
return FALSE;
}
}
return TRUE;
}
BOOL CADSIEditConnectDialog::DoDirty()
{
CEdit* pcNameBox = (CEdit*)GetDlgItem(IDC_CONNECTION_NAME);
CADSIEditContainerNode* pTreeNode = dynamic_cast<CADSIEditContainerNode*>(GetTreeNode());
CADSIEditRootData* pRootNode = GetRootNode();
ASSERT(pRootNode != NULL);
CComponentDataObject* pComponentData = GetComponentData();
SaveMRUs();
CString sRootDSE, s;
BuildRootDSE(sRootDSE);
CComPtr<IADs> spRootADs;
HRESULT hr, hCredResult;
hr = OpenObjectWithCredentials(
m_pNewConnectData,
m_pNewConnectData->GetCredentialObject()->UseCredentials(),
sRootDSE,
IID_IADs,
(LPVOID*) &spRootADs,
GetSafeHwnd(),
hCredResult
);
if ( FAILED(hr) )
{
if (SUCCEEDED(hCredResult))
{
ADSIEditErrorMessage(hr);
}
return FALSE;
}
CString sNamingContext, sDistinguishedName, sServerName;
m_pNewConnectData->GetNamingContext(sNamingContext);
m_pNewConnectData->GetDistinguishedName(sDistinguishedName);
if ( m_pNewConnectData->IsRootDSE())
{
s = g_lpszRootDSE;
if (!m_bNewConnect)
{
CString sName;
pcNameBox->GetWindowText(sName);
m_pNewConnectData->SetName(sName);
CString szProvider, sServer, sPort, sPath;
m_pNewConnectData->GetDomainServer(sServer);
m_pNewConnectData->GetPort(sPort);
m_pNewConnectData->GetLDAP(szProvider);
if (sServer != _T(""))
{
if (sPort != _T(""))
{
sPath = szProvider + sServer + _T(":") + sPort + _T("/") + CString(sName);
}
else
{
sPath = szProvider + sServer + _T("/") + CString(sName);
}
}
else
{
sPath = szProvider + CString(sName);
}
m_pNewConnectData->SetPath(sPath);
ASSERT(pTreeNode != NULL);
pTreeNode->SetDisplayName(sName + m_szDisplayExtra);
m_pNewConnectData->SetBasePath(_T(""));
}
else
{
// Name
LPWSTR objectName;
spRootADs->get_Name(&objectName);
if (objectName == NULL)
{
ADSIEditMessageBox(IDS_MSG_ROOTDSE_ERROR, MB_OK);
return FALSE;
}
m_pNewConnectData->SetName(objectName);
CString szProvider, sServer, sPort, sPath;
m_pNewConnectData->GetDomainServer(sServer);
m_pNewConnectData->GetPort(sPort);
m_pNewConnectData->GetLDAP(szProvider);
if (sServer != _T(""))
{
if (sPort != _T(""))
{
sPath = szProvider + sServer + _T(":") + sPort + _T("/") + CString(objectName);
}
else
{
sPath = szProvider + sServer + _T("/") + CString(objectName);
}
}
else
{
sPath = szProvider + CString(objectName);
}
m_pNewConnectData->SetPath(sPath);
m_pNewConnectData->SetClass(_T(""));
CString sName;
pcNameBox->GetWindowText(sName);
if (sName.GetLength() > 0)
{
//Create a connection node
m_pNewConnectData->SetName(sName);
CADSIEditConnectionNode *pConnectNode = new CADSIEditConnectionNode(m_pNewConnectData);
pConnectNode->SetDisplayName(sName + m_szDisplayExtra);
pConnectNode->GetConnectionData()->SetConnectionNode(pConnectNode);
VERIFY(pRootNode->AddChildToListAndUI(pConnectNode, pComponentData));
pComponentData->SetDescriptionBarText(pRootNode);
}
else
{
ADSIEditMessageBox(IDS_MSG_CONNECTION_NAME, MB_OK);
return FALSE;
}
}
} //if RootDSE
else
{
CComBSTR bstrPath;
if (!BuildNamingContext(bstrPath))
{
return FALSE;
}
if (!bstrPath)
{
return FALSE;
}
if (!BuildPath(s, (BSTR)bstrPath, spRootADs))
{
return FALSE;
}
if (!m_bNewConnect)
{
CString sName;
pcNameBox->GetWindowText(sName);
m_pNewConnectData->SetName(sName);
m_pNewConnectData->SetPath(s);
ASSERT(pTreeNode != NULL);
pTreeNode->SetDisplayName(sName + m_szDisplayExtra);
if (!pTreeNode->OnEnumerate(pComponentData))
{
return FALSE;
}
/* if (!pTreeNode->OnRefresh(pComponentData))
{
return FALSE;
}
*/
}
else
{
CComPtr<IDirectoryObject> spDirObject;
hr = OpenObjectWithCredentials(
m_pNewConnectData,
m_pNewConnectData->GetCredentialObject()->UseCredentials(),
s,
IID_IDirectoryObject,
(LPVOID*) &spDirObject,
GetSafeHwnd(),
hCredResult
);
if ( FAILED(hr) )
{
if (SUCCEEDED(hCredResult))
{
ADSIEditErrorMessage(hr);
}
return FALSE;
}
ADS_OBJECT_INFO* pInfo;
hr = spDirObject->GetObjectInformation(&pInfo);
if (FAILED(hr))
{
ADSIEditErrorMessage(hr);
return FALSE;
}
// Name
m_pNewConnectData->SetName(pInfo->pszRDN);
m_pNewConnectData->SetPath(s);
// Class
m_pNewConnectData->SetClass(pInfo->pszClassName);
FreeADsMem(pInfo);
CString sName;
pcNameBox->GetWindowText(sName);
if (sName.GetLength() > 0)
{
//Create a connection node
m_pNewConnectData->SetName(sName);
CADSIEditConnectionNode *pConnectNode = new CADSIEditConnectionNode(m_pNewConnectData);
pConnectNode->SetDisplayName(sName + m_szDisplayExtra);
pConnectNode->GetConnectionData()->SetConnectionNode(pConnectNode);
VERIFY(pRootNode->AddChildToListAndUI(pConnectNode, pComponentData));
pComponentData->SetDescriptionBarText(pRootNode);
}
else
{
ADSIEditMessageBox(IDS_MSG_CONNECTION_NAME, MB_OK);
return FALSE;
}
}
} //else
return TRUE;
}
BOOL CADSIEditConnectDialog::BuildPath(CString& s, BSTR bstrPath, IADs* pADs)
{
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CButton* pcNCRadio = (CButton*)GetDlgItem(IDC_NC_RADIO);
HRESULT hr;
CString szLDAP, basePath, sServer, sPort, sDistinguishedName;
m_pNewConnectData->GetLDAP(szLDAP);
m_pNewConnectData->GetDomainServer(sServer);
m_pNewConnectData->GetPort(sPort);
m_pNewConnectData->GetDistinguishedName(sDistinguishedName);
if ( pcNCRadio->GetCheck())
{
VARIANT var;
VariantInit(&var);
hr = pADs->Get( bstrPath, &var );
if ( FAILED(hr) )
{
VariantClear(&var);
return FALSE;
}
if (!sServer.IsEmpty())
{
s = s + sServer;
if (!sPort.IsEmpty())
{
s = s + _T(":") + sPort + _T("/");
}
else
{
s = s + _T("/");
}
}
s = s + V_BSTR(&var);
basePath = V_BSTR(&var);
VariantClear(&var);
}
else if(pcDNRadio->GetCheck())
{
if (!sServer.IsEmpty())
{
s = s + sServer;
if (!sPort.IsEmpty())
{
s = s + _T(":") + sPort + _T("/");
}
else
{
s = s + _T("/");
}
}
s = s + sDistinguishedName;
basePath = sDistinguishedName;
}
m_pNewConnectData->SetBasePath(basePath);
s = szLDAP + s;
return TRUE;
}
BOOL CADSIEditConnectDialog::BuildNamingContext(CComBSTR& bstrPath)
{
CButton* pcDNRadio = (CButton*)GetDlgItem(IDC_DN_RADIO);
CButton* pcNCRadio = (CButton*)GetDlgItem(IDC_NC_RADIO);
CString sNamingContext;
m_pNewConnectData->GetNamingContext(sNamingContext);
if ( pcNCRadio->GetCheck())
{
if ( sNamingContext == m_szDomain)
{
bstrPath = SysAllocString( L"defaultNamingContext");
}
else if ( sNamingContext == m_szSchema)
{
bstrPath = SysAllocString(L"schemaNamingContext");
}
else if ( sNamingContext == m_szConfigContainer)
{
bstrPath = SysAllocString(L"configurationNamingContext");
}
else
{
bstrPath = SysAllocString( L"defaultNamingContext");
}
m_pNewConnectData->SetDistinguishedName(_T(""));
}
else if (pcDNRadio->GetCheck())
{
CString sDistinguishedName;
m_pNewConnectData->GetDistinguishedName(sDistinguishedName);
if (sDistinguishedName.Find(L'=') == -1)
{
int iResult = ADSIEditMessageBox(IDS_MSG_NOT_X500_PATH, MB_YESNO | MB_DEFBUTTON2);
if (iResult == IDNO)
{
return FALSE;
}
}
bstrPath = sDistinguishedName.AllocSysString();
m_pNewConnectData->SetNamingContext(_T(""));
}
return TRUE;
}
void CADSIEditConnectDialog::BuildRootDSE(CString& sRootDSE)
{
CButton* pDefaultRadio = (CButton*)GetDlgItem(IDC_DEFAULT_RADIO);
CString sServer, sPort, sLDAP;
m_pNewConnectData->GetDomainServer(sServer);
m_pNewConnectData->GetPort(sPort);
m_pNewConnectData->GetLDAP(sLDAP);
if (!sServer.IsEmpty())
{
sRootDSE = sLDAP + sServer;
if (!sPort.IsEmpty())
{
sRootDSE = sRootDSE + _T(":") + sPort + _T("/");
}
else
{
sRootDSE = sRootDSE + _T("/");
}
sRootDSE = sRootDSE + g_lpszRootDSE;
}
else
{
sRootDSE = sLDAP + g_lpszRootDSE;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
// CADSIEditAdvancedConnectionDialog :
BEGIN_MESSAGE_MAP(CADSIEditAdvancedConnectionDialog, CDialog)
//{{AFX_MSG_MAP(CADsObjectDialog)
ON_BN_CLICKED(IDC_CREDENTIALS_CHECK, OnCredentials)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
CADSIEditAdvancedConnectionDialog::CADSIEditAdvancedConnectionDialog(CContainerNode* pRootDataNode,
CTreeNode* pContainerNode, CComponentDataObject* pComponentData, CConnectionData* pConnectData)
: CDialog(IDD_CONNECTION_ADVANCED)
{
// Get the local data
//
m_pTreeNode = pContainerNode;
m_pContainerNode = pRootDataNode;
ASSERT(pComponentData != NULL);
m_pComponentData = pComponentData;
ASSERT(pConnectData != NULL);
m_pConnectData = pConnectData;
}
CADSIEditAdvancedConnectionDialog::~CADSIEditAdvancedConnectionDialog()
{
}
BOOL CADSIEditAdvancedConnectionDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// Attach all the controls
//
CEdit* pcPortBox = (CEdit*)GetDlgItem(IDC_PORT);
CButton* pcLDAPRadio = (CButton*)GetDlgItem(IDC_LDAP_RADIO);
CButton* pcGCRadio = (CButton*)GetDlgItem(IDC_GC_RADIO);
CButton* pcCredCheck = (CButton*)GetDlgItem(IDC_CREDENTIALS_CHECK);
CEdit* pcUsernameBox = (CEdit*)GetDlgItem(IDC_USERNAME);
CEdit* pcPasswordBox = (CEdit*)GetDlgItem(IDC_PASSWORD);
// disable IME support on numeric edit fields
ImmAssociateContext(pcPortBox->GetSafeHwnd(), NULL);
// Set the initial state of the controls
//
CString sLDAP;
m_pConnectData->GetLDAP(sLDAP);
// NOTICE-2002/03/01-artm Both strings always null terminated, wcscmp() okay.
// sLDAP is a CString and g_lpszLDAP is a constant.
if (wcscmp(sLDAP, g_lpszLDAP) == 0)
{
pcLDAPRadio->SetCheck(BST_CHECKED);
}
else
{
pcGCRadio->SetCheck(BST_CHECKED);
}
CString sPort;
m_pConnectData->GetPort(sPort);
pcPortBox->SetWindowText(sPort);
if (m_pConnectData->GetCredentialObject()->UseCredentials())
{
CString sUser;
m_pConnectData->GetCredentialObject()->GetUsername(sUser);
pcCredCheck->SetCheck(TRUE);
OnCredentials();
pcUsernameBox->SetWindowText(sUser);
}
pcPasswordBox->SetLimitText(MAX_PASSWORD_LENGTH);
return TRUE;
}
void CADSIEditAdvancedConnectionDialog::OnOK()
{
OnApply();
CDialog::OnOK();
}
BOOL CADSIEditAdvancedConnectionDialog::OnApply()
{
BOOL success = TRUE;
CEdit* pcPortBox = (CEdit*)GetDlgItem(IDC_PORT);
CButton* pcLDAPRadio = (CButton*)GetDlgItem(IDC_LDAP_RADIO);
CButton* pcCredCheck = (CButton*)GetDlgItem(IDC_CREDENTIALS_CHECK);
CEdit* pcUsernameBox = (CEdit*)GetDlgItem(IDC_USERNAME);
// Make the connection data reflect the controls
//
CString sPort;
pcPortBox->GetWindowText(sPort);
m_pConnectData->SetPort(sPort);
if (pcLDAPRadio->GetCheck())
{
m_pConnectData->SetLDAP(g_lpszLDAP);
}
else
{
m_pConnectData->SetLDAP(g_lpszGC);
}
if (pcCredCheck->GetCheck())
{
// Get user name and password
//
CString sUser;
HRESULT hr;
pcUsernameBox->GetWindowText(sUser);
m_pConnectData->GetCredentialObject()->SetUsername(sUser);
hr = m_pConnectData->GetCredentialObject()->SetPasswordFromHwnd(
GetSafeHwnd(),
IDC_PASSWORD);
if (FAILED(hr))
{
success = FALSE;
}
m_pConnectData->GetCredentialObject()->SetUseCredentials(TRUE);
}
else
{
m_pConnectData->GetCredentialObject()->SetUseCredentials(FALSE);
}
return success;
}
void CADSIEditAdvancedConnectionDialog::OnCredentials()
{
CButton* pcCredCheck = (CButton*)GetDlgItem(IDC_CREDENTIALS_CHECK);
CButton* pcCredGroup = (CButton*)GetDlgItem(IDC_CREDENTIALS_GROUP);
CStatic* pcCredUser = (CStatic*)GetDlgItem(IDC_CREDENTIALS_USER);
CStatic* pcCredPassword = (CStatic*)GetDlgItem(IDC_CREDENTIALS_PASSWORD);
CEdit* pcUsernameBox = (CEdit*)GetDlgItem(IDC_USERNAME);
CEdit* pcPasswordBox = (CEdit*)GetDlgItem(IDC_PASSWORD);
BOOL bResult = pcCredCheck->GetCheck();
if (bResult)
{
// Enable Username and password fields
//
pcCredGroup->EnableWindow(bResult);
pcCredUser->EnableWindow(bResult);
pcCredPassword->EnableWindow(bResult);
pcUsernameBox->EnableWindow(bResult);
pcPasswordBox->EnableWindow(bResult);
}
else
{
// Enable Username and password fields
//
pcCredGroup->EnableWindow(FALSE);
pcCredUser->EnableWindow(FALSE);
pcCredPassword->EnableWindow(FALSE);
pcUsernameBox->EnableWindow(FALSE);
pcPasswordBox->EnableWindow(FALSE);
}
}