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.
404 lines
10 KiB
404 lines
10 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|
|
}
|