|
|
//+---------------------------------------------------------------------------
//
// 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; }
|