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.
293 lines
8.3 KiB
293 lines
8.3 KiB
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1997 - 2000.
|
|
//
|
|
// File: QueryEngine.hxx
|
|
//
|
|
// Contents: Declaration of data structures and classes used to perform
|
|
// queries and store the results.
|
|
//
|
|
// Classes: SQueryParams
|
|
// CQueryEngine
|
|
//
|
|
// Notes: The term "query" is used loosely here to mean either an
|
|
// LDAP directory search or a WinNt enumeration.
|
|
//
|
|
// History: 04-13-2000 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#ifndef __QUERY_ENGINE_HXX_
|
|
#define __QUERY_ENGINE_HXX_
|
|
|
|
|
|
enum QUERY_LIMIT
|
|
{
|
|
QL_NO_LIMIT,
|
|
QL_USE_REGISTRY_LIMIT
|
|
};
|
|
|
|
enum WORKER_THREAD_STATE
|
|
{
|
|
WTS_EXIT, // terminating
|
|
WTS_WAIT, // waiting on thread event
|
|
WTS_QUERY // performing query
|
|
};
|
|
|
|
const ULONG DEFAULT_PAGE_SIZE = 100;
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Struct: SQueryParams (qp)
|
|
//
|
|
// Purpose: Contain all the parameters for a query
|
|
//
|
|
// History: 04-13-2000 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
struct SQueryParams
|
|
{
|
|
SQueryParams():
|
|
hwndCredPromptParentDlg(NULL),
|
|
hwndNotify(NULL),
|
|
ADsScope(ADS_SCOPE_BASE),
|
|
Limit(QL_USE_REGISTRY_LIMIT),
|
|
hQueryCompleteEvent(INVALID_HANDLE_VALUE),
|
|
CustomizerInteraction(CUSTINT_IGNORE_CUSTOM_OBJECTS),
|
|
ulBindFlags(0),
|
|
performExternalCustomization(FALSE),
|
|
perfromDefaultCustomization(FALSE)
|
|
|
|
{
|
|
}
|
|
|
|
SQueryParams(
|
|
const SQueryParams &rhs)
|
|
{
|
|
operator=(rhs);
|
|
}
|
|
|
|
SQueryParams &
|
|
operator =(
|
|
const SQueryParams &rhs)
|
|
{
|
|
hwndCredPromptParentDlg = rhs.hwndCredPromptParentDlg;
|
|
hwndNotify = rhs.hwndNotify;
|
|
rpScope = rhs.rpScope;
|
|
strADsPath = rhs.strADsPath;
|
|
ulBindFlags = rhs.ulBindFlags;
|
|
strLdapFilter = rhs.strLdapFilter;
|
|
vstrWinNtFilter = rhs.vstrWinNtFilter;
|
|
vakAttributesToRead = rhs.vakAttributesToRead;
|
|
ADsScope = rhs.ADsScope;
|
|
Limit = rhs.Limit;
|
|
hQueryCompleteEvent = rhs.hQueryCompleteEvent;
|
|
CustomizerInteraction = rhs.CustomizerInteraction;
|
|
strCustomizerArg = rhs.strCustomizerArg;
|
|
performExternalCustomization = rhs.performExternalCustomization;
|
|
perfromDefaultCustomization = rhs.perfromDefaultCustomization;
|
|
|
|
return *this;
|
|
}
|
|
|
|
~SQueryParams()
|
|
{
|
|
hwndCredPromptParentDlg = NULL;
|
|
hwndNotify = NULL;
|
|
ADsScope = ADS_SCOPE_BASE;
|
|
Limit = QL_USE_REGISTRY_LIMIT;
|
|
hQueryCompleteEvent = INVALID_HANDLE_VALUE;
|
|
CustomizerInteraction = CUSTINT_IGNORE_CUSTOM_OBJECTS;
|
|
ulBindFlags = 0;
|
|
}
|
|
|
|
HWND hwndCredPromptParentDlg;
|
|
HWND hwndNotify;
|
|
RpScope rpScope;
|
|
String strADsPath;
|
|
ULONG ulBindFlags;
|
|
String strLdapFilter;
|
|
vector<String> vstrWinNtFilter;
|
|
AttrKeyVector vakAttributesToRead;
|
|
ADS_SCOPEENUM ADsScope;
|
|
QUERY_LIMIT Limit;
|
|
HANDLE hQueryCompleteEvent;
|
|
CUSTOMIZER_INTERACTION CustomizerInteraction;
|
|
String strCustomizerArg;
|
|
BOOL performExternalCustomization;
|
|
BOOL perfromDefaultCustomization;
|
|
};
|
|
|
|
|
|
|
|
|
|
//+--------------------------------------------------------------------------
|
|
//
|
|
// Class: CQueryEngine (qe)
|
|
//
|
|
// Purpose: Perform synchronous or asynchronous queries and hold the
|
|
// results.
|
|
//
|
|
// History: 04-13-2000 DavidMun Created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
class CQueryEngine
|
|
{
|
|
public:
|
|
|
|
CQueryEngine(
|
|
const CObjectPicker &rop);
|
|
|
|
~CQueryEngine();
|
|
|
|
HRESULT
|
|
Initialize();
|
|
|
|
void
|
|
Clear() const
|
|
{
|
|
TRACE_METHOD(CQueryEngine, Clear);
|
|
|
|
CAutoCritSec AutoLock(&m_cs);
|
|
m_vObjects.clear();
|
|
m_hrLastQueryResult = S_OK;
|
|
}
|
|
|
|
HRESULT
|
|
AsyncDirSearch(
|
|
const SQueryParams &qp,
|
|
ULONG *pusnThisWorkItem = NULL) const;
|
|
|
|
HRESULT
|
|
SyncDirSearch(
|
|
const SQueryParams &qp) const;
|
|
|
|
void
|
|
StopWorkItem() const;
|
|
|
|
Variant
|
|
GetObjectAttr(
|
|
size_t idxRow,
|
|
ATTR_KEY at) const;
|
|
|
|
CDsObject
|
|
GetObject(
|
|
size_t idxRow) const
|
|
{
|
|
CAutoCritSec Lock(&m_cs);
|
|
ASSERT(idxRow < m_vObjects.size());
|
|
return m_vObjects[idxRow];
|
|
}
|
|
|
|
size_t
|
|
GetItemCount() const
|
|
{
|
|
CAutoCritSec Lock(&m_cs);
|
|
return m_vObjects.size();
|
|
}
|
|
|
|
HRESULT
|
|
GetLastQueryResult() const
|
|
{
|
|
return m_hrLastQueryResult;
|
|
}
|
|
|
|
private:
|
|
|
|
CQueryEngine &
|
|
operator =(const CQueryEngine &);
|
|
|
|
void
|
|
_AddObject(
|
|
const CDsObject dso)
|
|
{
|
|
CAutoCritSec Lock(&m_cs);
|
|
m_vObjects.push_back(dso);
|
|
}
|
|
|
|
static DWORD WINAPI
|
|
_tThread_Proc(
|
|
LPVOID pvThis);
|
|
|
|
// auxiliar in _tPerformLdapQuery
|
|
HRESULT
|
|
_tAddApprovedObjects
|
|
(
|
|
CDsObjectList &dsolToAdd
|
|
);
|
|
|
|
void
|
|
_tPerformLdapQuery();
|
|
|
|
void
|
|
_tPerformWinNtEnum();
|
|
|
|
void
|
|
_tAddCustomObjects();
|
|
|
|
void
|
|
_tAddFromDataObject(
|
|
IDataObject *pdo);
|
|
|
|
//
|
|
// Member variables for threading:
|
|
//
|
|
// m_DesiredThreadState - written to by main thread, read by worker
|
|
// thread.
|
|
//
|
|
// m_CurrentThreadState - read/written by worker thread. Always
|
|
// reflects the state the thread is in or is transitioning to.
|
|
//
|
|
// m_hThreadEvent - worker thread blocks on this handle with
|
|
// m_CurrentThreadState set to WTS_WAIT.
|
|
//
|
|
// m_cs - protects m_vObjects so that main thread reads and worker
|
|
// thread writes do not collide.
|
|
//
|
|
// m_usnCurWorkItem - an update sequence counter (just a monotonically
|
|
// increasing counter) which corresponds to the work item
|
|
// the thread is currently processing. Also represents the
|
|
// work item from which objects in m_vObjects were generated.
|
|
//
|
|
// m_usnNextWorkItem - incremented whenever the main thread submits
|
|
// a new work item.
|
|
//
|
|
// How these are used:
|
|
//
|
|
// The main thread assigns a value to m_DesiredThreadState, increments
|
|
// m_usnNextWorkItem, then sets m_hThreadEvent. The worker thread
|
|
// unblocks on m_hThreadEvent, then sets m_CurrentThreadState to
|
|
// m_DesiredThreadState, m_usnCurWorkItem to m_usnNextWorkItem, and
|
|
// performs the required work.
|
|
//
|
|
// If m_DesiredThreadState is WTS_EXIT the worker thread terminates,
|
|
// otherwise it performs the requested work. When the work is
|
|
// complete, worker thread changes m_CurrentThreadState to WTS_WAIT
|
|
// and resumes waiting on m_hThreadEvent.
|
|
//
|
|
// While processing work for m_usnCurWorkItem the worker thread
|
|
// periodically checks to see if m_usnNextWorkItem is greater than
|
|
// m_usnCurWorkItem. If it is, it abandons its current work,
|
|
// switches to WTS_WAIT state, and resumes waiting on m_hThreadEvent.
|
|
//
|
|
|
|
const CObjectPicker &m_rop;
|
|
HANDLE m_hThread;
|
|
HANDLE m_hThreadEvent;
|
|
mutable WORKER_THREAD_STATE m_CurrentThreadState;
|
|
mutable WORKER_THREAD_STATE m_DesiredThreadState;
|
|
mutable SQueryParams m_CurQueryParams;
|
|
mutable SQueryParams m_NextQueryParams;
|
|
mutable ULONG m_usnCurWorkItem;
|
|
mutable ULONG m_usnNextWorkItem;
|
|
mutable CRITICAL_SECTION m_cs;
|
|
mutable vector<CDsObject> m_vObjects;
|
|
mutable HRESULT m_hrLastQueryResult;
|
|
};
|
|
|
|
|
|
#endif // __QUERY_ENGINE_HXX_
|
|
|