//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: connectui.cpp // //-------------------------------------------------------------------------- #include "pch.h" #include #include "resource.h" #include "connection.h" #include "connectionui.h" #include #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(GetTreeNode()); CADSIEditRootData* pRootNode = GetRootNode(); ASSERT(pRootNode != NULL); CComponentDataObject* pComponentData = GetComponentData(); SaveMRUs(); CString sRootDSE, s; BuildRootDSE(sRootDSE); CComPtr 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 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); } }