WindowsXP-SP1/ds/adsi/ldap/cquery.cxx
2020-09-30 16:53:49 +02:00

423 lines
11 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 2000.
//
// File: umisrch.cxx
//
// Contents: This file contains the query object for the LDAP provider.
// IUmiQuery is the interface supported by this object. The
// properties on the interface property list of this object are
// mapped to the preferences you can set for IDirectorySearch.
//
// History: 03-27-00 AjayR Created.
//
//----------------------------------------------------------------------------
#include "ldap.hxx"
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::CUmiLDAPQuery --- Constructor.
//
// Synopsis: Standard constructor.
//
// Arguments: N/A.
//
// Returns: N/A.
//
// Modifies: N/A.
//
//----------------------------------------------------------------------------
CUmiLDAPQuery::CUmiLDAPQuery():
_pIntfPropMgr(NULL),
_pszQueryText(NULL),
_pszLanguage(NULL),
_ulStatus(0)
{
}
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::~CUmiLDAPQuery --- Destructor.
//
// Synopsis: Standard destructor.
//
// Arguments: N/A.
//
// Returns: N/A.
//
// Modifies: N/A.
//
//----------------------------------------------------------------------------
CUmiLDAPQuery::~CUmiLDAPQuery()
{
if (_pIntfPropMgr) {
delete _pIntfPropMgr;
}
if (_pszQueryText) {
FreeADsStr(_pszQueryText);
}
if (_pszLanguage) {
FreeADsStr(_pszLanguage);
}
}
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::CreateUmiLDAPQuery --- STATIC constructor.
//
// Synopsis: Static constructor.
//
// Arguments: riid - Interface needed on new object.
// ppObj - Return ptr for newly created object.
//
// Returns: S_OK on success or any suitable error code.
//
// Modifies: N/A.
//
//----------------------------------------------------------------------------
HRESULT
CUmiLDAPQuery::CreateUmiLDAPQuery(
IID riid,
void FAR* FAR* ppObj
)
{
HRESULT hr = S_OK;
CUmiLDAPQuery *pQuery;
CPropertyManager *pIntfPropMgr = NULL;
if (!ppObj) {
RRETURN(E_INVALIDARG);
}
pQuery = new CUmiLDAPQuery();
if (!pQuery) {
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
}
hr = CPropertyManager::CreatePropertyManager(
(IUmiQuery *) pQuery,
NULL, // IADs ptr
NULL, // pCreds
IntfPropsQuery,
&pIntfPropMgr
);
BAIL_ON_FAILURE(hr);
hr = pQuery->QueryInterface(riid, ppObj);
BAIL_ON_FAILURE(hr)
pQuery->Release();
pQuery->_pIntfPropMgr = pIntfPropMgr;
RRETURN(hr);
error :
if (pQuery) {
delete pQuery;
}
if (pIntfPropMgr) {
delete pIntfPropMgr;
}
RRETURN(hr);
}
//
// IUnknown support - standard query interface method.
//
STDMETHODIMP
CUmiLDAPQuery::QueryInterface(REFIID iid, LPVOID FAR* ppv)
{
HRESULT hr = S_OK;
if (ppv == NULL) {
RRETURN(E_POINTER);
}
if (IsEqualIID(iid, IID_IUnknown)){
*ppv = (IUnknown FAR *) this;
}
else if (IsEqualIID(iid, IID_IUmiPropList)) {
*ppv = (IUmiConnection FAR *) this;
}
else if (IsEqualIID(iid, IID_IUmiBaseObject)) {
*ppv = (IUmiConnection FAR *) this;
}
else if (IsEqualIID(iid, IID_IUmiQuery)) {
*ppv = (IUmiQuery FAR *) this;
}
else {
*ppv = NULL;
return E_NOINTERFACE;
}
AddRef();
return NOERROR;
}
//
// IUmiQuery methods.
//
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::Set --- IUmiQuery support.
//
// Synopsis: Sets the query string and language.
//
// Arguments: pszLanguage - Language used to specify the query,
// only LDAP and SQL/WQL are supported.
// uFlags - Flags, only 0 is allowed now.
// pszText - Query text.
//
// Returns: N/A.
//
// Modifies: Internal query and language strings.
//
//----------------------------------------------------------------------------
STDMETHODIMP
CUmiLDAPQuery::Set(
IN LPCWSTR pszLanguage,
IN ULONG uFlags,
IN LPCWSTR pszText
)
{
HRESULT hr = S_OK;
SetLastStatus(0);
//
// Validate params
//
if (!pszLanguage || !pszText) {
BAIL_ON_FAILURE(hr = E_INVALIDARG);
}
if (uFlags != 0) {
BAIL_ON_FAILURE(hr = UMI_E_INVALID_FLAGS);
}
if (_wcsicmp(pszLanguage, L"LDAP")
&& _wcsicmp(pszLanguage, L"SQL")
&& _wcsicmp(pszLanguage, L"WQL")
) {
//
// We do not support this language.
//
BAIL_ON_FAILURE(hr = E_INVALIDARG);
}
//
// Free exisitng stuff if needed.
//
if (_pszLanguage) {
FreeADsStr(_pszLanguage);
_pszLanguage = NULL;
}
if (_pszQueryText) {
FreeADsStr(_pszQueryText);
}
_pszLanguage = AllocADsStr(pszLanguage);
if (!_pszLanguage) {
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
}
_pszQueryText = AllocADsStr(pszText);
if (!_pszQueryText) {
BAIL_ON_FAILURE(hr = E_OUTOFMEMORY);
}
error:
if (FAILED(hr)) {
SetLastStatus(hr);
hr = MapHrToUmiError(hr);
}
RRETURN(hr);
}
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::GetQuery --- IUmiQuery support.
//
// Synopsis: Returns the query language and text in the user allocated
// buffers provided.
//
// Arguments: puLangBufSize - Size of buffer for language string.
// pszLangBuf - The actual buffer.
// puQyeryTextBufSiz - Size of buffer for queyr text.
// pszQueryTextBuf - Buffer for query text.
//
// Returns: S_OK on success or any appropriate error code.
//
// Modifies: pszLangBuf and pszQueryText on success. On failure,
// * puLangBufSize and *puQueryTextBufSize are updated with
// the length of the buffers needed (length in bytes).
//
//----------------------------------------------------------------------------
STDMETHODIMP
CUmiLDAPQuery::GetQuery(
IN OUT ULONG * puLangBufSize,
IN OUT LPWSTR pszLangBuf,
IN OUT ULONG * puQueryTextBufSize,
IN OUT LPWSTR pszQueryTextBuf
)
{
HRESULT hr = S_OK;
SetLastStatus(0);
if (!_pszLanguage || !_pszQueryText) {
BAIL_ON_FAILURE(hr = UMI_E_NOT_FOUND);
}
if (!puLangBufSize || !puQueryTextBufSize) {
BAIL_ON_FAILURE(hr = E_INVALIDARG);
}
if ((*puLangBufSize < ((wcslen(_pszLanguage) + 1) * sizeof(WCHAR)))
|| *puQueryTextBufSize < ((wcslen(_pszQueryText) + 1) * sizeof(WCHAR))
) {
//
// We really need an insufficient buffer error for this.
//
*puLangBufSize = (wcslen(_pszLanguage) + 1) * sizeof(WCHAR);
*puQueryTextBufSize = (wcslen(_pszQueryText) + 1) * sizeof(WCHAR);
BAIL_ON_FAILURE( hr = E_OUTOFMEMORY);
}
//
// We have enough space in the provided buffers.
//
wcscpy(pszLangBuf, _pszLanguage);
wcscpy(pszQueryTextBuf, _pszQueryText);
error:
if (FAILED(hr)) {
SetLastStatus(hr);
hr = MapHrToUmiError(hr);
}
RRETURN(hr);
}
//
// IUmiBaseObject methods.
//
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::GetLastStatus (IUmiBaseObject method).
//
// Synopsis: Returns only numeric status code from the last operation.
//
// Arguments: uFlags - Only 0 is supported for now.
// puSpecificStatus - Returns status/error code.
// riid - Not used.
// pStatusObj - NULL, not used currently.
//
// Returns: UMI_S_NO_ERROR on success. Error code otherwise.
//
// Modifies: *puSpecificStatus to return appropriate status code.
//
//----------------------------------------------------------------------------
STDMETHODIMP
CUmiLDAPQuery::GetLastStatus(
IN ULONG uFlags,
OUT ULONG *puSpecificStatus,
IN REFIID riid,
OUT LPVOID *pStatusObj
)
{
if (uFlags != 0) {
RRETURN(UMI_E_INVALID_FLAGS);
}
if (!puSpecificStatus) {
RRETURN(E_INVALIDARG);
}
if (pStatusObj) {
//
// Should we error out ?
//
*pStatusObj = NULL;
}
*puSpecificStatus = _ulStatus;
RRETURN(UMI_S_NO_ERROR);
}
//+---------------------------------------------------------------------------
// Function: CUmiLDAPQuery::GetInterfacePropList (IUmiBaseObject method).
//
// Synopsis: Returns a pointer to the interface property list for
// cursor object.
//
// Arguments: uFlags - Flags, only 0 is supported.
// ppPropList - Return value.
//
// Returns: UMI_S_NO_ERROR on success. Error code otherwise.
//
// Modifies: *pPropList changed to IUmiPropList pointer
//
//----------------------------------------------------------------------------
STDMETHODIMP
CUmiLDAPQuery::GetInterfacePropList(
IN ULONG uFlags,
OUT IUmiPropList **pPropList
)
{
HRESULT hr = UMI_S_NO_ERROR;
SetLastStatus(0);
if (uFlags != 0) {
SetLastStatus(hr);
RRETURN(UMI_E_INVALID_FLAGS);
}
//
// QI will check for bad pointer so no need to check here.
//
hr = _pIntfPropMgr->QueryInterface(IID_IUmiPropList, (void **)pPropList);
if (FAILED(hr)) {
SetLastStatus(hr);
}
RRETURN(hr);
}
//
// Private/Protected Methods.
//
//+---------------------------------------------------------------------------
// Function: CUmiCursor::SetLastStatus (internal private helper routine).
//
// Synopsis: Sets the status of the last operation. If the status is one
// of the pre-defined error codes, then the status is just set to
// 0 since we are not adding any value by returning the same
// status as the error code.
//
// Arguments: ulStatus - Status to be set.
//
// Returns: Nothing
//
// Modifies: Internal member status variable.
//
//----------------------------------------------------------------------------
void
CUmiLDAPQuery::SetLastStatus(ULONG ulStatus)
{
this->_ulStatus = ulStatus;
return;
}