|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: querynode.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#include <SnapBase.h>
#include "resource.h"
#include "connection.h"
#include "querynode.h"
#include "queryui.h"
#include "editor.h"
#include <aclpage.h>
#ifdef DEBUG_ALLOCATOR
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
#endif
////////////////////////////////////////////////////////////////////////
// CADSIEditQueryData
void CADSIEditQueryData::SetRootPath(LPCWSTR lpszRootPath) { m_sRootPath = lpszRootPath;
GetDisplayPath(m_sDN); }
void CADSIEditQueryData::GetDisplayPath(CString& sDisplayPath) { CComPtr<IADsPathname> pIADsPathname; HRESULT hr = ::CoCreateInstance(CLSID_Pathname, NULL, CLSCTX_INPROC_SERVER, IID_IADsPathname, (PVOID *)&(pIADsPathname)); ASSERT((S_OK == hr) && ((pIADsPathname) != NULL));
hr = pIADsPathname->Set(CComBSTR(m_sRootPath), ADS_SETTYPE_FULL); if (FAILED(hr)) { TRACE(_T("Set failed. %s"), hr); }
// Get the leaf name
CString sDN; BSTR bstrPath = NULL; hr = pIADsPathname->Retrieve(ADS_FORMAT_X500_DN, &bstrPath); if (FAILED(hr)) { TRACE(_T("Failed to get element. %s"), hr); sDisplayPath = L""; } else { sDisplayPath = bstrPath; } }
void CADSIEditQueryData::GetDisplayName(CString& sDisplayName) { CString sDisplayPath; GetDisplayPath(sDisplayPath); sDisplayName = m_sName + _T(" [") + sDisplayPath + _T("]"); }
////////////////////////////////////////////////////////////////////////
// CADSIEditQueryNode
//
// {072B64B7-CFF7-11d2-8801-00C04F72ED31}
const GUID CADSIEditQueryNode::NodeTypeGUID = { 0x72b64b7, 0xcff7, 0x11d2, { 0x88, 0x1, 0x0, 0xc0, 0x4f, 0x72, 0xed, 0x31 } };
CADSIEditQueryNode::CADSIEditQueryNode(CADsObject* pADsObject, CADSIEditQueryData* pQueryData) { m_pADsObject = pADsObject; m_pQueryData = pQueryData; m_nState = notLoaded; m_sType.LoadString(IDS_QUERY_STRING); }
HRESULT CADSIEditQueryNode::OnCommand(long nCommandID, DATA_OBJECT_TYPES type, CComponentDataObject* pComponentData, CNodeList* pNodeList) { ASSERT (pNodeList->GetCount() == 1); // not allowing multiple selection on any of these yet
switch (nCommandID) { case IDM_SETTINGS_QUERY : { OnSettings(pComponentData); break; } case IDM_REMOVE_QUERY : { OnRemove(pComponentData); break; } default: ASSERT(FALSE); // Unknown command!
return E_FAIL; } return S_OK; }
BOOL CADSIEditQueryNode::OnSetDeleteVerbState(DATA_OBJECT_TYPES type, BOOL* pbHideVerb, CNodeList* pNodeList) { if (pNodeList->GetCount() == 1) // single selection
{ *pbHideVerb = TRUE; // always hide the verb
return FALSE; }
//
// Multiple selection
//
*pbHideVerb = FALSE; return TRUE; }
void CADSIEditQueryNode::OnRemove(CComponentDataObject* pComponentData) { if (ADSIEditMessageBox(IDS_MSG_REMOVE_QUERY, MB_YESNO | MB_DEFBUTTON2) == IDYES) { BOOL bLocked = IsThreadLocked(); ASSERT(!bLocked); // cannot do refresh on locked node, the UI should prevent this
if (bLocked) return; if (IsSheetLocked()) { if (!CanCloseSheets()) return; // Do deletion stuff
pComponentData->GetPropertyPageHolderTable()->DeleteSheetsOfNode(this); } ASSERT(!IsSheetLocked());
// Remove query data from connection node's list
GetADsObject()->GetConnectionNode()->RemoveQueryFromList(GetQueryData());
// now remove from the UI
DeleteHelper(pComponentData); pComponentData->SetDescriptionBarText(GetContainer()); delete this; // gone
} }
void CADSIEditQueryNode::OnDelete(CComponentDataObject* pComponentData, CNodeList* pNodeList) { if (pNodeList->GetCount() > 1) // multiple selection
{ // Delete some results
OnDeleteMultiple(pComponentData, pNodeList); } else if (pNodeList->GetCount() == 1) // single selection
{ // Can't delete a query node
ASSERT(FALSE); } }
void CADSIEditQueryNode::OnSettings(CComponentDataObject* pComponentData) { CThemeContextActivator activator;
// Get the data from the existing query node data
BOOL bOneLevel; bOneLevel = (GetQueryData()->GetScope() == ADS_SCOPE_ONELEVEL); CString sFilter, sName, sPath, sConnectPath; GetQueryData()->GetName(sName); GetQueryData()->GetFilter(sFilter); GetQueryData()->GetRootPath(sPath);
CConnectionData* pConnectData = GetADsObject()->GetConnectionNode()->GetConnectionData(); ASSERT(pConnectData);
GetADsObject()->GetConnectionNode()->GetADsObject()->GetPath(sConnectPath);
CCredentialObject* pCredObject = pConnectData->GetCredentialObject();
CString szServer; pConnectData->GetDomainServer(szServer);
// Initialize dialog with data
CADSIEditQueryDialog queryDialog(szServer, sName, sFilter, sPath, sConnectPath, bOneLevel, pCredObject);
if (queryDialog.DoModal() == IDOK) { // If OK
CString sNewPath; queryDialog.GetResults(sName, sFilter, sNewPath, &bOneLevel); GetQueryData()->SetName(sName); GetQueryData()->SetFilter(sFilter); GetQueryData()->SetRootPath(sNewPath); GetADsObject()->SetPath(sNewPath); ADS_SCOPEENUM scope = (bOneLevel) ? ADS_SCOPE_ONELEVEL : ADS_SCOPE_SUBTREE; GetQueryData()->SetScope(scope);
// Make changes take effect
CString sDisplayName; GetQueryData()->GetDisplayName(sDisplayName); SetDisplayName(sDisplayName);
CNodeList nodeList; nodeList.AddTail(this); OnRefresh(pComponentData, &nodeList); } }
LPCWSTR CADSIEditQueryNode::GetString(int nCol) { switch(nCol) { case N_HEADER_NAME : return GetDisplayName(); case N_HEADER_TYPE : return m_sType; case N_HEADER_DN : return m_pQueryData->GetDNString(); default : return NULL; } }
BOOL CADSIEditQueryNode::HasPropertyPages(DATA_OBJECT_TYPES type, BOOL* pbHideVerb, CNodeList* pNodeList) { *pbHideVerb = TRUE; // always hide the verb
return FALSE; }
BOOL CADSIEditQueryNode::OnAddMenuItem(LPCONTEXTMENUITEM2 pContextMenuItem, long *pInsertionAllowed) {
if (pContextMenuItem->lCommandID == IDM_SETTINGS_QUERY) { return TRUE; } else if (pContextMenuItem->lCommandID == IDM_REMOVE_QUERY) { return TRUE; } return FALSE; }
CQueryObj* CADSIEditQueryNode::OnCreateQuery() { CConnectionData* pConnectData = GetADsObject()->GetConnectionNode()->GetConnectionData(); CADSIEditRootData* pRootData = static_cast<CADSIEditRootData*>(GetRootContainer()); CComponentDataObject* pComponentData = pRootData->GetComponentDataObject(); RemoveAllChildrenHelper(pComponentData);
CString sPath; GetADsObject()->GetPath(sPath);
CString sFilter; GetQueryData()->GetFilter(sFilter); ADS_SCOPEENUM scope; scope = GetQueryData()->GetScope();
CADSIEditQueryObject* pQuery = new CADSIEditQueryObject(sPath, sFilter, scope, pConnectData->GetMaxObjectCount(), pConnectData->GetCredentialObject(), pConnectData->IsGC(), pConnectData->GetConnectionNode()); return pQuery; }
BOOL CADSIEditQueryNode::OnSetRefreshVerbState(DATA_OBJECT_TYPES type, BOOL* pbHide, CNodeList* pNodeList) { *pbHide = FALSE;
if (m_nState == loading) { return FALSE; }
return !IsThreadLocked(); }
void CADSIEditQueryNode::OnChangeState(CComponentDataObject* pComponentDataObject) { switch (m_nState) { case notLoaded: case loaded: case unableToLoad: case accessDenied: { m_nState = loading; m_dwErr = 0; } break; case loading: { if (m_dwErr == 0) m_nState = loaded; else if (m_dwErr == ERROR_ACCESS_DENIED) m_nState = accessDenied; else m_nState = unableToLoad; } break; default: ASSERT(FALSE); } VERIFY(SUCCEEDED(pComponentDataObject->ChangeNode(this, CHANGE_RESULT_ITEM_ICON))); VERIFY(SUCCEEDED(pComponentDataObject->UpdateVerbState(this))); }
int CADSIEditQueryNode::GetImageIndex(BOOL bOpenImage) { int nIndex = 0; switch (m_nState) { case notLoaded: nIndex = ZONE_IMAGE_1; break; case loading: nIndex = ZONE_IMAGE_LOADING_1; break; case loaded: nIndex = ZONE_IMAGE_1; break; case unableToLoad: nIndex = ZONE_IMAGE_UNABLE_TO_LOAD_1; break; case accessDenied: nIndex = ZONE_IMAGE_ACCESS_DENIED_1; break; default: ASSERT(FALSE); } return nIndex; }
BOOL CADSIEditQueryNode::CanCloseSheets() { //
// We can't do this with the new property page since it is not derived
// from the base class in MTFRMWK.
//
//return (IDCANCEL != ADSIEditMessageBox(IDS_MSG_RECORD_CLOSE_SHEET, MB_OKCANCEL));
ADSIEditMessageBox(IDS_MSG_RECORD_SHEET_LOCKED, MB_OK); return FALSE; }
void CADSIEditQueryNode::OnHaveData(CObjBase* pObj, CComponentDataObject* pComponentDataObject) { CTreeNode* p = dynamic_cast<CTreeNode*>(pObj); ASSERT(p != NULL); if (p != NULL) { AddChildToListAndUI(p, pComponentDataObject); pComponentDataObject->SetDescriptionBarText(this); } }
void CADSIEditQueryNode::OnError(DWORD dwerr) { if (dwerr == ERROR_TOO_MANY_NODES) { // need to pop message
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CThemeContextActivator activator;
CString szFmt; szFmt.LoadString(IDS_MSG_QUERY_TOO_MANY_ITEMS); CString szMsg; szMsg.Format(szFmt, GetDisplayName()); AfxMessageBox(szMsg); } else { ADSIEditErrorMessage(dwerr); } }
|