2166 lines
59 KiB
C++
2166 lines
59 KiB
C++
// adsqryDoc.cpp : implementation of the CAdsqryDoc class
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "adsqDoc.h"
|
||
#include "adsdsrc.h"
|
||
#include "oledberr.h"
|
||
#include "adsdb.h"
|
||
#include "csyntax.h"
|
||
#include "newquery.h"
|
||
|
||
#ifdef _DEBUG
|
||
#define new DEBUG_NEW
|
||
#undef THIS_FILE
|
||
static char THIS_FILE[] = __FILE__;
|
||
#endif
|
||
|
||
#ifdef BUILD_FOR_NT40
|
||
typedef DWORD DWORD_PTR;
|
||
#endif
|
||
|
||
/***********************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
CADsDataSource::CADsDataSource( )
|
||
{
|
||
m_pSearchPref = NULL;
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
CADsDataSource::~CADsDataSource( )
|
||
{
|
||
if( NULL != m_pSearchPref )
|
||
{
|
||
FreeADsMem( m_pSearchPref );
|
||
}
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::SetQueryParameters
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
/*void CADsDataSource::SetQueryParameters( CString& strSource,
|
||
CString& strQuery,
|
||
CString& strAttributes,
|
||
CString& strScope,
|
||
CString& strUserName,
|
||
CString& strPassword,
|
||
BOOL bEncryptPassword,
|
||
BOOL bUseSQL )
|
||
{
|
||
m_strSource = strSource;
|
||
m_strQuery = strQuery;
|
||
m_strAttributes = strAttributes;
|
||
m_strScope = strScope;
|
||
m_strUserName = strUserName;
|
||
m_strPassword = strPassword;
|
||
m_bEncryptPassword = bEncryptPassword;
|
||
m_bUseSQL = bUseSQL;
|
||
} */
|
||
|
||
|
||
void CADsDataSource::SetQueryParameters( SEARCHPREF* pSearchPref )
|
||
{
|
||
if( NULL == m_pSearchPref )
|
||
{
|
||
m_pSearchPref = (SEARCHPREF*) AllocADsMem( sizeof(SEARCHPREF) );
|
||
}
|
||
|
||
*m_pSearchPref = *pSearchPref;
|
||
}
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
int CADsDataSource::GetColumnsCount( int nRow )
|
||
{
|
||
ASSERT( FALSE );
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsDataSource::GetValue( int nRow, int nColumn, CString& )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsDataSource::GetValue( int nRow, CString& strColumn, CString& )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsDataSource::GetADsPath( int nRow, CString& )
|
||
{
|
||
ASSERT( FALSE );
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsDataSource::GetColumnText( int nRow, int nColumn, CString& )
|
||
{
|
||
ASSERT( FALSE );
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsDataSource::Refresh( void )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/***********************************************************
|
||
Function: CADsDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsDataSource::RunTheQuery( void )
|
||
{
|
||
ASSERT( FALSE );
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::CADsOleDBDataSource
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
CADsOleDBDataSource::CADsOleDBDataSource( )
|
||
{
|
||
CoGetMalloc(MEMCTX_TASK, &m_pIMalloc);
|
||
|
||
m_pData = NULL;
|
||
m_pBindStatus = NULL;
|
||
m_hRows = NULL;
|
||
m_pIRowset = NULL;
|
||
m_pIColsInfo = NULL;
|
||
m_pAccessor = NULL;
|
||
m_nColumnsCount = 0;
|
||
m_prgColInfo = NULL;
|
||
m_szColNames = NULL;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::~CADsOleDBDataSource
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
CADsOleDBDataSource::~CADsOleDBDataSource( )
|
||
{
|
||
DestroyInternalData( );
|
||
m_pIMalloc->Release( );
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::GetColumnsCount
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
int CADsOleDBDataSource::GetColumnsCount( int nRow )
|
||
{
|
||
if( m_nColumnsCount )
|
||
{
|
||
return (int)(m_nColumnsCount - m_nAddOne);
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::GetColumnText
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsOleDBDataSource::GetColumnText( int nRow, int nColumn, CString& rValue )
|
||
{
|
||
nColumn += m_nAddOne;
|
||
|
||
if( nColumn < 0 || nColumn >= (int)m_nColumnsCount )
|
||
{
|
||
ASSERT( FALSE );
|
||
return FALSE;
|
||
}
|
||
|
||
if( FALSE )
|
||
{
|
||
rValue = _T("ADsPath");
|
||
}
|
||
else
|
||
{
|
||
TCHAR szColumnName[ MAX_PATH ];
|
||
|
||
Convert( szColumnName, m_prgColInfo[ nColumn + 1].pwszName );
|
||
|
||
rValue = szColumnName;
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::CreateAccessorHelper
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsOleDBDataSource::CreateAccessorHelp( void )
|
||
{
|
||
|
||
DBBINDING* prgBindings = NULL;
|
||
HRESULT hResult;
|
||
ULONG i;
|
||
IAccessor* pIAccessor = NULL;
|
||
|
||
prgBindings = (DBBINDING *) LocalAlloc(
|
||
LPTR,
|
||
sizeof(DBBINDING) * (m_nColumnsCount)
|
||
);
|
||
if(NULL == prgBindings)
|
||
return E_OUTOFMEMORY;
|
||
|
||
//
|
||
// Set up rest of the attributes
|
||
//
|
||
for ( i=0; i < m_nColumnsCount ; i++)
|
||
{
|
||
prgBindings[i].iOrdinal = i+1;
|
||
prgBindings[i].obValue = sizeof(Data)*i + offsetof(Data, obValue);
|
||
prgBindings[i].obLength = sizeof(Data)*i + offsetof(Data, obLength);
|
||
prgBindings[i].obStatus = sizeof(Data)*i + offsetof(Data, status);
|
||
prgBindings[i].dwPart = DBPART_VALUE|DBPART_LENGTH|DBPART_STATUS;
|
||
//prgBindings[i].dwMemOwner = DBMEMOWNER_PROVIDEROWNED;
|
||
prgBindings[i].wType = m_prgColInfo[i+1].wType;
|
||
prgBindings[i].dwFlags = 0;
|
||
|
||
if( prgBindings[i].wType & DBTYPE_BYREF )
|
||
{
|
||
prgBindings[i].dwMemOwner = DBMEMOWNER_PROVIDEROWNED;
|
||
}
|
||
else
|
||
{
|
||
prgBindings[i].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
|
||
}
|
||
|
||
if( m_prgColInfo[i+1].wType == DBTYPE_DATE ||
|
||
m_prgColInfo[i+1].wType == DBTYPE_I8 )
|
||
{
|
||
prgBindings[i].obValue = sizeof(Data)*i + offsetof(Data, obValue2);
|
||
}
|
||
|
||
}
|
||
|
||
|
||
hResult= m_pIRowset->QueryInterface( IID_IAccessor, (void**) &pIAccessor );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
//
|
||
// With the bindings create the accessor
|
||
//
|
||
hResult = pIAccessor->CreateAccessor(
|
||
DBACCESSOR_ROWDATA,
|
||
m_nColumnsCount,
|
||
prgBindings,
|
||
0,
|
||
&m_hAccessor,
|
||
m_pBindStatus
|
||
);
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
{
|
||
AfxMessageBox( _T("IAccessor::CreateAccessor failed") );
|
||
}
|
||
|
||
pIAccessor->Release();
|
||
LocalFree(prgBindings);
|
||
|
||
return( SUCCEEDED( hResult ) );
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::SetQueryCredentials
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
HRESULT CADsOleDBDataSource::SetQueryCredentials( IDBInitialize* pInit,
|
||
ICommandText* pCommand )
|
||
{
|
||
DBPROPSET aPropSet;
|
||
DBPROP arrProp[ 20 ];
|
||
HRESULT hResult;
|
||
int nIter, nIdx;
|
||
|
||
ASSERT( !( (NULL != pInit) && (NULL != pCommand) ) );
|
||
|
||
for ( nIter = 0; nIter < 20; nIter++)
|
||
{
|
||
VariantInit( &(arrProp[ nIter ].vValue ) );
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_BSTR;
|
||
arrProp[ nIter ].dwOptions = DBPROPOPTIONS_REQUIRED;
|
||
}
|
||
|
||
if( NULL != pInit )
|
||
{
|
||
IDBProperties* pIProp = NULL;
|
||
|
||
if( !_tcslen(m_pSearchPref->szUserName) )
|
||
{
|
||
return S_OK;
|
||
}
|
||
|
||
hResult = pInit->QueryInterface( IID_IDBProperties, (void**)&pIProp );
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if( FAILED( hResult ) )
|
||
return hResult;
|
||
|
||
nIter = 0;
|
||
if( _tcslen(m_pSearchPref->szUserName) )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = DBPROP_AUTH_USERID;
|
||
V_BSTR( &(arrProp[ nIter ].vValue) ) = AllocBSTR( m_pSearchPref->szUserName );
|
||
nIter++;
|
||
|
||
arrProp[ nIter ].dwPropertyID = DBPROP_AUTH_PASSWORD;
|
||
V_BSTR( &(arrProp[ nIter ].vValue) ) = AllocBSTR( m_pSearchPref->szPassword );
|
||
nIter++;
|
||
|
||
arrProp[ nIter ].dwPropertyID = DBPROP_AUTH_ENCRYPT_PASSWORD;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_BOOL;
|
||
|
||
if( m_pSearchPref->bEncryptPassword )
|
||
{
|
||
V_BOOL( &(arrProp[ nIter ].vValue) ) = VARIANT_TRUE;
|
||
}
|
||
else
|
||
{
|
||
V_BOOL( &(arrProp[ nIter ].vValue) ) = VARIANT_FALSE;
|
||
}
|
||
nIter++;
|
||
|
||
aPropSet.rgProperties = arrProp;
|
||
aPropSet.cProperties = nIter;
|
||
aPropSet.guidPropertySet = DBPROPSET_DBINIT;
|
||
|
||
hResult = pIProp->SetProperties( 1, &aPropSet );
|
||
|
||
ASSERT( S_OK == hResult );
|
||
|
||
for ( nIdx = 0; nIdx < nIter ; nIdx++ )
|
||
{
|
||
VariantClear( &(arrProp[ nIdx ].vValue ) );
|
||
}
|
||
nIter = 0;
|
||
}
|
||
|
||
pIProp->Release( );
|
||
}
|
||
|
||
if( NULL != pCommand )
|
||
{
|
||
ICommandProperties* pCommandProp = NULL;
|
||
|
||
|
||
hResult = pCommand->QueryInterface( IID_ICommandProperties,
|
||
(void**) &pCommandProp );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if( FAILED( hResult ) )
|
||
return hResult;
|
||
|
||
nIter = 0;
|
||
// Initialize the VARIANTs and the options in rgProps.
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nAsynchronous )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_ASYNCHRONOUS;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_BOOL;
|
||
|
||
if( m_pSearchPref->nAsynchronous )
|
||
{
|
||
V_BOOL( &(arrProp[ nIter ].vValue) ) = VARIANT_TRUE;
|
||
}
|
||
else
|
||
{
|
||
V_BOOL( &(arrProp[ nIter ].vValue) ) = VARIANT_FALSE;
|
||
}
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nAttributesOnly )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_ATTRIBTYPES_ONLY;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_BOOL;
|
||
|
||
if( m_pSearchPref->nAttributesOnly )
|
||
{
|
||
V_BOOL( &(arrProp[ nIter ].vValue) ) = VARIANT_TRUE;
|
||
}
|
||
else
|
||
{
|
||
V_BOOL( &(arrProp[ nIter ].vValue) ) = VARIANT_FALSE;
|
||
}
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nTimeOut )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_TIMEOUT;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_I4;
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = m_pSearchPref->nTimeOut;
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nTimeLimit )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_TIME_LIMIT;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_I4;
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = m_pSearchPref->nTimeLimit;
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nSizeLimit )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_SIZE_LIMIT;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_I4;
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = m_pSearchPref->nSizeLimit;
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nPageSize )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_PAGESIZE;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_I4;
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = m_pSearchPref->nPageSize;
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
|
||
if( _tcslen( m_pSearchPref->szScope ) )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_SEARCH_SCOPE;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_I4;
|
||
if( !_tcsicmp( m_pSearchPref->szScope, _T("subtree") ) )
|
||
{
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = ADS_SCOPE_SUBTREE;
|
||
}
|
||
else if( !_tcsicmp( m_pSearchPref->szScope, _T("onelevel") ) )
|
||
{
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = ADS_SCOPE_ONELEVEL;
|
||
}
|
||
else
|
||
{
|
||
V_I4( &(arrProp[ nIter ].vValue ) ) = ADS_SCOPE_BASE;
|
||
}
|
||
|
||
nIter++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nChaseReferrals )
|
||
{
|
||
arrProp[ nIter ].dwPropertyID = ADSIPROP_CHASE_REFERRALS;
|
||
V_VT( &(arrProp[ nIter ].vValue ) ) = VT_I4;
|
||
if( m_pSearchPref->nChaseReferrals )
|
||
{
|
||
V_I4( &(arrProp[ nIter ].vValue) ) = ADS_CHASE_REFERRALS_ALWAYS;
|
||
}
|
||
else
|
||
{
|
||
V_I4( &(arrProp[ nIter ].vValue) ) = ADS_CHASE_REFERRALS_NEVER;
|
||
}
|
||
nIter++;
|
||
}
|
||
|
||
|
||
|
||
// Create the initialization structure.
|
||
if( nIter )
|
||
{
|
||
aPropSet.rgProperties = arrProp;
|
||
aPropSet.cProperties = nIter;
|
||
aPropSet.guidPropertySet = DBPROPSET_ADSISEARCH;
|
||
|
||
hResult = pCommandProp->SetProperties( 1, &aPropSet );
|
||
|
||
ASSERT( S_OK == hResult );
|
||
|
||
for ( nIdx = 0; nIdx < nIter ; nIdx++ )
|
||
{
|
||
VariantClear( &(arrProp[ nIdx ].vValue ) );
|
||
}
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
}
|
||
pCommandProp->Release( );
|
||
}
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::RunTheQuery
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsOleDBDataSource::RunTheQuery( void )
|
||
{
|
||
HRESULT hResult;
|
||
|
||
IDBInitialize * pIDBInit = NULL;
|
||
IDBCreateSession * pIDBCS = NULL;
|
||
IDBCreateCommand * pIDBCreateCommand= NULL;
|
||
ICommandText * pICommandText = NULL;
|
||
ICommand * pICommand = NULL;
|
||
DBBINDSTATUS * pMyStatus = NULL;
|
||
CString strCommandText;
|
||
BSTR bstrCommandText;
|
||
HCURSOR aCursor, oldCursor;
|
||
|
||
aCursor = LoadCursor( NULL, IDC_WAIT );
|
||
oldCursor = SetCursor( aCursor );
|
||
|
||
m_nCurrentRow = -1;
|
||
m_nFirstRow = -1;
|
||
m_nLastRow = -1;
|
||
m_bNoMoreData = FALSE;
|
||
m_hRows = NULL;
|
||
|
||
m_nAddOne = 0;
|
||
m_strAttributes = m_pSearchPref->szAttributes;
|
||
|
||
if( !_tcsicmp( m_pSearchPref->szAttributes, _T("*") ) )
|
||
{
|
||
CString strTemp = _T("ADsPath,");
|
||
|
||
strTemp += m_pSearchPref->szAttributes;
|
||
m_strAttributes = strTemp;
|
||
m_nAddOne = 1;
|
||
}
|
||
|
||
if( !m_pSearchPref->bUseSQL )
|
||
{
|
||
strCommandText = m_pSearchPref->szSource;
|
||
if( strCommandText[ 0 ] != _T('<') )
|
||
{
|
||
CString strTemp;
|
||
|
||
strTemp = _T("<");
|
||
strTemp = strTemp + strCommandText;
|
||
strTemp = strTemp + _T(">");
|
||
strCommandText = strTemp;
|
||
}
|
||
|
||
strCommandText += _T(';');
|
||
strCommandText += m_pSearchPref->szQuery;
|
||
strCommandText += _T(';');
|
||
strCommandText += m_strAttributes;
|
||
|
||
/*if( _tcslen( m_pSearchPref->szScope ) )
|
||
{
|
||
strCommandText += _T(';');
|
||
strCommandText += m_pSearchPref->szScope;
|
||
}*/
|
||
}
|
||
else
|
||
{
|
||
strCommandText = _T("SELECT ");
|
||
strCommandText += m_strAttributes;
|
||
|
||
strCommandText += _T(" FROM '");
|
||
strCommandText += m_pSearchPref->szSource;
|
||
strCommandText += _T("'");
|
||
|
||
strCommandText += _T(" WHERE ");
|
||
strCommandText += m_pSearchPref->szQuery;
|
||
}
|
||
|
||
bstrCommandText = AllocBSTR( strCommandText.GetBuffer( strCommandText.GetLength( ) + 1 ) );
|
||
|
||
//
|
||
// Instantiate a data source object for LDAP provider
|
||
//
|
||
while( TRUE )
|
||
{
|
||
hResult = CoCreateInstance( CLSID_ADsDSOObject,
|
||
0,
|
||
CLSCTX_INPROC_SERVER,
|
||
IID_IDBInitialize,
|
||
(void **)&pIDBInit
|
||
);
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("CoCreateInstance failed \n"));
|
||
AfxMessageBox( _T("CoCreateInstance failed") );
|
||
break;
|
||
}
|
||
|
||
//
|
||
// Initialize the Data Source
|
||
//
|
||
|
||
hResult = SetQueryCredentials( pIDBInit, NULL );
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
hResult = pIDBInit->Initialize();
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("IDBIntialize::Initialize failed \n"));
|
||
AfxMessageBox( _T("IDBIntialize::Initialize failed") );
|
||
break;
|
||
}
|
||
|
||
hResult = pIDBInit->QueryInterface(
|
||
IID_IDBCreateSession,
|
||
(void**) &pIDBCS);
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("QueryInterface for IDBCreateSession failed \n"));
|
||
AfxMessageBox( _T("QueryInterface for IDBCreateSession failed") );
|
||
break;
|
||
}
|
||
|
||
pIDBInit->Release( );
|
||
pIDBInit = NULL;
|
||
|
||
//
|
||
// Create a session returning a pointer to its CreateCommand interface
|
||
//
|
||
hResult = pIDBCS->CreateSession(
|
||
NULL,
|
||
IID_IDBCreateCommand,
|
||
(LPUNKNOWN*) &pIDBCreateCommand
|
||
);
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE( _T("IDBCreateSession::CreateSession failed \n") );
|
||
AfxMessageBox( _T("IDBCreateSession::CreateSession failed") );
|
||
break;
|
||
}
|
||
|
||
pIDBCS->Release( );
|
||
pIDBCS = NULL;
|
||
|
||
//
|
||
// Create a command from the session object
|
||
//
|
||
hResult = pIDBCreateCommand->CreateCommand(
|
||
NULL,
|
||
IID_ICommandText,
|
||
(LPUNKNOWN*) &pICommandText
|
||
);
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE( _T(" IDBCreateCommand::CreateCommand failed\n") );
|
||
AfxMessageBox( _T("IDBCreateCommand::CreateCommand failed") );
|
||
break;
|
||
}
|
||
|
||
pIDBCreateCommand->Release( );
|
||
pIDBCreateCommand = NULL;
|
||
|
||
hResult = SetQueryCredentials( NULL, pICommandText );
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if( !m_pSearchPref->bUseSQL )
|
||
{
|
||
hResult = pICommandText->SetCommandText(
|
||
DBGUID_LDAPDialect,
|
||
bstrCommandText
|
||
);
|
||
}
|
||
else
|
||
{
|
||
hResult = pICommandText->SetCommandText(
|
||
DBGUID_DBSQL,
|
||
bstrCommandText
|
||
);
|
||
}
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("ICommandText::CommandText failed \n"));
|
||
AfxMessageBox( _T("ICommandText::CommandText failed") );
|
||
break;
|
||
}
|
||
|
||
hResult = pICommandText->QueryInterface(
|
||
IID_ICommand,
|
||
(void**) &pICommand);
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("QueryInterface for ICommand failed \n") );
|
||
AfxMessageBox( _T("QueryInterface for ICommand failed ") );
|
||
break;
|
||
}
|
||
|
||
pICommandText->Release();
|
||
pICommandText = NULL;
|
||
|
||
//
|
||
// Do the Query and get back a rowset
|
||
//
|
||
pICommand->AddRef( );
|
||
pICommand->Release( );
|
||
|
||
hResult = pICommand->Execute(
|
||
NULL,
|
||
IID_IRowset,
|
||
NULL,
|
||
NULL,
|
||
(LPUNKNOWN *)&m_pIRowset
|
||
);
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("ICommand::Execute failed \n"));
|
||
AfxMessageBox( _T("ICommand::Execute failed") );
|
||
pICommand->Release( );
|
||
pICommand = NULL;
|
||
|
||
break;
|
||
}
|
||
|
||
m_pIRowset->AddRef( );
|
||
m_pIRowset->Release( );
|
||
|
||
pICommand->Release( );
|
||
pICommand = NULL;
|
||
|
||
|
||
hResult = m_pIRowset->QueryInterface(
|
||
IID_IColumnsInfo,
|
||
(void**) &m_pIColsInfo
|
||
);
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("QueryInterface for IColumnsInfo failed \n"));
|
||
AfxMessageBox( _T("QueryInterface for IColumnsInfo failed") );
|
||
break;
|
||
}
|
||
|
||
hResult = m_pIColsInfo->GetColumnInfo(
|
||
&m_nColumnsCount,
|
||
&m_prgColInfo,
|
||
&m_szColNames
|
||
);
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE( _T("IColumnsInfo::GetColumnInfo failed \n") );
|
||
AfxMessageBox( _T("IColumnsInfo::GetColumnInfo failed") );
|
||
break;
|
||
}
|
||
|
||
//
|
||
// The no. of attributes is one less than the no. of columns because of
|
||
// the Bookmark column
|
||
//
|
||
m_nColumnsCount--;
|
||
|
||
m_pData = (Data *) LocalAlloc( LPTR, sizeof(Data) * m_nColumnsCount );
|
||
|
||
m_pBindStatus = (DBBINDSTATUS *) LocalAlloc(
|
||
LPTR,
|
||
sizeof(DBBINDSTATUS) * m_nColumnsCount
|
||
);
|
||
hResult = CreateAccessorHelp( );
|
||
if(FAILED(hResult))
|
||
{
|
||
TRACE(_T("CreateAccessorHelper failed \n"));
|
||
break;
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
SysFreeString( bstrCommandText );
|
||
|
||
SetCursor( oldCursor );
|
||
|
||
return SUCCEEDED( hResult );
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::AdvanceCursor
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsOleDBDataSource::AdvanceCursor( void )
|
||
{
|
||
HRESULT hResult;
|
||
DBCOUNTITEM cRowsObtained;
|
||
HCURSOR aCursor, oldCursor;
|
||
|
||
aCursor = LoadCursor( NULL, IDC_WAIT );
|
||
oldCursor = SetCursor( aCursor );
|
||
|
||
if( !m_bNoMoreData )
|
||
{
|
||
cRowsObtained = 0;
|
||
|
||
if( m_hRows )
|
||
{
|
||
ULONG refCount[ ROWS ];
|
||
DBROWSTATUS rowStat[ ROWS ];
|
||
|
||
m_pIRowset->ReleaseRows( ROWS,
|
||
m_hRows,
|
||
NULL,
|
||
refCount,
|
||
rowStat );
|
||
|
||
m_pIMalloc->Free( m_hRows );
|
||
m_hRows = NULL;
|
||
}
|
||
|
||
TRACE( _T("Ask for %d rows starting from %d\n"), ROWS, m_nLastRow + 1 );
|
||
|
||
hResult = m_pIRowset->GetNextRows(
|
||
NULL,
|
||
0,
|
||
ROWS,
|
||
//1L,
|
||
&cRowsObtained,
|
||
&m_hRows
|
||
);
|
||
TRACE( _T("After asking for %d rows starting from %d\n"), ROWS, m_nLastRow + 1 );
|
||
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
m_nFirstRow = m_nLastRow + 1;
|
||
m_nLastRow = (int)(m_nFirstRow + cRowsObtained - 1);
|
||
}
|
||
|
||
m_bNoMoreData = (cRowsObtained != ROWS);
|
||
}
|
||
|
||
SetCursor( oldCursor );
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::GetADsPath
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsOleDBDataSource::GetADsPath( int nRow, CString& rPath )
|
||
{
|
||
ASSERT( nRow < m_ADsPath.GetSize( ) );
|
||
|
||
if( ! (nRow < m_ADsPath.GetSize( ) ) )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
rPath = m_ADsPath.GetAt( nRow );
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::GetValue
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsOleDBDataSource::GetValue( int nRow, int nColumn, CString& rValue )
|
||
{
|
||
HRESULT hResult;
|
||
|
||
nColumn += m_nAddOne;
|
||
|
||
ASSERT( nRow >= 0 );
|
||
if( nRow < 0 )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
ASSERT( nColumn >=0 && nColumn < (int)m_nColumnsCount );
|
||
if( nColumn < 0 || nColumn >= (int)m_nColumnsCount )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
if( !BringRowInBuffer( nRow ) )
|
||
return FALSE;
|
||
|
||
if( m_nCurrentRow != nRow )
|
||
{
|
||
hResult = m_pIRowset->GetData( m_hRows[nRow - m_nFirstRow],
|
||
m_hAccessor,
|
||
(void*)m_pData );
|
||
m_nCurrentRow = nRow;
|
||
|
||
ReadADsPath( );
|
||
}
|
||
|
||
if( SUCCEEDED( hResult) )
|
||
{
|
||
rValue = ExtractData( nColumn );
|
||
}
|
||
else
|
||
{
|
||
rValue = _T("Error");
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::ReadADsPath
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
void CADsOleDBDataSource::ReadADsPath( void )
|
||
{
|
||
CString strADsPath;
|
||
|
||
strADsPath = ExtractData( 0 );
|
||
m_ADsPath.Add( strADsPath );
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::ExtractData
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
CString CADsOleDBDataSource::ExtractData( int nColumn )
|
||
{
|
||
ULONG i;
|
||
TCHAR szValue[ 2048 ] = _T("Error");
|
||
HRESULT hResult;
|
||
|
||
i = nColumn;
|
||
|
||
if( m_pData[i].status == DBSTATUS_S_ISNULL )
|
||
return CString(_T("<No value>") );
|
||
|
||
if( !( m_prgColInfo[i+1].dwFlags & DBCOLUMNFLAGS_ISNULLABLE &&
|
||
m_pData[i].status == DBSTATUS_S_ISNULL))
|
||
{
|
||
|
||
switch(m_prgColInfo[i+1].wType)
|
||
{
|
||
case DBTYPE_I8:
|
||
LARGE_INTEGERToString( szValue, (LARGE_INTEGER*)&m_pData[i].obValue2 );
|
||
break;
|
||
|
||
case DBTYPE_I4:
|
||
wsprintf( szValue, _T("%ld"), (DWORD_PTR) m_pData[i].obValue );
|
||
break;
|
||
|
||
case DBTYPE_BOOL:
|
||
wsprintf( szValue, _T("%s"),
|
||
(VARIANT_TRUE == (VARIANT_BOOL) m_pData[i].obValue) ? _T("TRUE") : _T("FALSE") );
|
||
|
||
break;
|
||
|
||
case DBTYPE_DATE:
|
||
{
|
||
VARIANT varTemp, varString;
|
||
HRESULT hResult;
|
||
|
||
VariantInit( &varString );
|
||
VariantInit( &varTemp );
|
||
|
||
V_VT( &varTemp ) = VT_DATE;
|
||
V_DATE( &varTemp ) = (DATE) m_pData[i].obValue2;
|
||
|
||
hResult= VariantChangeType( &varString, &varTemp, VARIANT_NOVALUEPROP, VT_BSTR );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
Convert( szValue, V_BSTR( &varString ) );
|
||
VariantClear( &varString );
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
case DBTYPE_STR | DBTYPE_BYREF:
|
||
if( NULL != (char *)m_pData[i].obValue )
|
||
{
|
||
wsprintf( szValue, _T("%s"), (char *)m_pData[i].obValue );
|
||
}
|
||
else
|
||
{
|
||
_tcscpy( szValue, _T("NULL") );
|
||
}
|
||
break;
|
||
|
||
case DBTYPE_BYTES | DBTYPE_BYREF:
|
||
{
|
||
TCHAR szTemp[ 16 ];
|
||
ULONG ulIter;
|
||
BYTE* pByte;
|
||
|
||
_ltot ( m_pData[i].obLength, szTemp, 10 );
|
||
_tcscpy ( szValue, _T("[") );
|
||
_tcscat ( szValue, szTemp );
|
||
_tcscat ( szValue, _T("] ") );
|
||
pByte = (BYTE*) (m_pData[i].obValue);
|
||
|
||
for( ulIter = 0; ulIter < m_pData[i].obLength && _tcslen( szValue ) < 2000; ulIter++ )
|
||
{
|
||
BYTE bVal;
|
||
|
||
bVal = pByte[ ulIter ];
|
||
_itot( (int)bVal , szTemp, 16 );
|
||
_tcscat ( szValue, _T("x") );
|
||
_tcscat ( szValue, szTemp );
|
||
_tcscat ( szValue, _T(" ") );
|
||
}
|
||
}
|
||
break;
|
||
|
||
case DBTYPE_WSTR | DBTYPE_BYREF:
|
||
if( NULL != (WCHAR *)m_pData[i].obValue )
|
||
{
|
||
wsprintf( szValue, _T("%S"), (WCHAR *) m_pData[i].obValue );
|
||
}
|
||
else
|
||
{
|
||
_tcscpy( szValue, _T("NULL") );
|
||
}
|
||
break;
|
||
|
||
case DBTYPE_VARIANT | DBTYPE_BYREF:
|
||
{
|
||
|
||
ULONG dwSLBound;
|
||
ULONG dwSUBound, j;
|
||
void HUGEP *pArray;
|
||
VARIANT *pVariant;
|
||
|
||
pArray = NULL;
|
||
pVariant = (VARIANT*) m_pData[i].obValue;
|
||
|
||
if( NULL == pVariant )
|
||
_tcscpy( szValue, _T("ERROR!!! m_pData[i].obValue is NULL") );
|
||
|
||
|
||
while( TRUE && (NULL != pVariant) )
|
||
{
|
||
|
||
ASSERT( V_VT( pVariant ) & VT_ARRAY );
|
||
if( ! (V_VT( pVariant ) & VT_ARRAY ) )
|
||
break;
|
||
|
||
|
||
hResult = SafeArrayGetLBound( V_ARRAY(pVariant),
|
||
1,
|
||
(long FAR *) &dwSLBound );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
hResult = SafeArrayGetUBound( V_ARRAY(pVariant),
|
||
1,
|
||
(long FAR *) &dwSUBound );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
hResult = SafeArrayAccessData( V_ARRAY(pVariant),
|
||
&pArray );
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
_tcscpy( szValue, _T("") );
|
||
|
||
for ( j = dwSLBound; j <= dwSUBound; j++ )
|
||
{
|
||
TCHAR szTemp[ 1024 ];
|
||
|
||
switch( pVariant->vt & ~VT_ARRAY )
|
||
{
|
||
case VT_BSTR:
|
||
Convert( szTemp, ( (BSTR *)pArray )[j] );
|
||
break;
|
||
|
||
case VT_I8:
|
||
LARGE_INTEGERToString( szTemp, &( (LARGE_INTEGER *)pArray )[j] );
|
||
break;
|
||
|
||
case VT_I4:
|
||
_ltot( ((DWORD *) pArray)[j], szTemp, 10 );
|
||
break;
|
||
|
||
case VT_BOOL:
|
||
_tcscpy( szTemp, (((VARIANT_BOOL *) pArray)[j]) == VARIANT_TRUE ?
|
||
_T("TRUE") : _T("FALSE") );
|
||
break;
|
||
|
||
case VT_VARIANT:
|
||
{
|
||
VARIANT* pVar;
|
||
|
||
pVar = ((VARIANT *)pArray) + j;
|
||
switch( V_VT( pVar ) )
|
||
{
|
||
case VT_BSTR:
|
||
Convert( szTemp, V_BSTR( pVar ) );
|
||
break;
|
||
|
||
case VT_I4:
|
||
_ltot( V_I4( pVar ), szTemp, 10 );
|
||
break;
|
||
|
||
case VT_BOOL:
|
||
_tcscpy( szTemp, V_BOOL( pVar ) == VARIANT_TRUE ?
|
||
_T("TRUE") : _T("FALSE") );
|
||
break;
|
||
|
||
default:
|
||
ASSERT( FALSE ) ;
|
||
_tcscpy( szTemp, _T("Unsupported") );
|
||
break;
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
default:
|
||
_tcscpy( szTemp, _T("Unsupported") );
|
||
}
|
||
|
||
if( _tcslen( szValue) + _tcslen( szTemp ) < 2040 )
|
||
{
|
||
if( j != dwSLBound )
|
||
{
|
||
_tcscat( szValue, _T("# ") );
|
||
}
|
||
|
||
_tcscat( szValue, szTemp );
|
||
}
|
||
}
|
||
|
||
SafeArrayUnaccessData( V_ARRAY(pVariant) );
|
||
break;
|
||
}
|
||
|
||
break;
|
||
}
|
||
|
||
default:
|
||
wsprintf( szValue, _T("Don't know how to convert") );
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
_tcscpy( szValue, _T("NA") );
|
||
}
|
||
|
||
return CString( szValue );
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::BringRowInBuffer
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
BOOL CADsOleDBDataSource::BringRowInBuffer( int nRow )
|
||
{
|
||
if( nRow >= m_nFirstRow && nRow <= m_nLastRow )
|
||
return TRUE;
|
||
|
||
if( m_nLastRow == -1 )
|
||
AdvanceCursor( );
|
||
|
||
while( nRow > m_nLastRow && !m_bNoMoreData )
|
||
AdvanceCursor( );
|
||
|
||
if (nRow >= m_nFirstRow && nRow <= m_nLastRow)
|
||
{
|
||
return TRUE;
|
||
}
|
||
|
||
return FALSE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsOleDBDataSource::DestroyInternalData
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
***********************************************************/
|
||
void CADsOleDBDataSource::DestroyInternalData( void )
|
||
{
|
||
if( m_hRows )
|
||
{
|
||
m_pIMalloc->Free( m_hRows );
|
||
}
|
||
if( m_pBindStatus )
|
||
{
|
||
LocalFree( m_pBindStatus );
|
||
}
|
||
if( m_pData )
|
||
{
|
||
LocalFree( m_pData );
|
||
}
|
||
if( m_pIRowset )
|
||
{
|
||
m_pIRowset->Release( );
|
||
}
|
||
if( m_pIColsInfo )
|
||
{
|
||
m_pIColsInfo->Release( );
|
||
}
|
||
if( m_pAccessor )
|
||
{
|
||
m_pAccessor->Release( );
|
||
}
|
||
if( m_prgColInfo )
|
||
{
|
||
m_pIMalloc->Free( m_prgColInfo );
|
||
}
|
||
if( m_szColNames )
|
||
{
|
||
m_pIMalloc->Free( m_szColNames );
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
CADsSearchDataSource::CADsSearchDataSource( )
|
||
{
|
||
m_pSearch = NULL;
|
||
m_nCurrentRow = -1;
|
||
m_hSearch = NULL;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
CADsSearchDataSource::~CADsSearchDataSource( )
|
||
{
|
||
if( m_pSearch )
|
||
{
|
||
m_pSearch->CloseSearchHandle( m_hSearch );
|
||
m_pSearch->Release( );
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
int CADsSearchDataSource::GetColumnsCount( int nRow )
|
||
{
|
||
BOOL bOK;
|
||
|
||
bOK = BringRowInBuffer( nRow );
|
||
if( bOK )
|
||
{
|
||
return (int)m_strColumns.GetSize( );
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsSearchDataSource::GetValue
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::GetValue( int nRow, int nColumn, CString& )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
/*****************************************************************************
|
||
Function: CADsSearchDataSource::GetValue
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::GetValue( int nRow, CString& strColumn, CString& rValue )
|
||
{
|
||
HRESULT hResult;
|
||
BSTR bstrColumnName;
|
||
ADS_SEARCH_COLUMN aSearchColumn;
|
||
ADS_ATTR_INFO aAttrDef;
|
||
BOOL bOK = TRUE;
|
||
COleDsSyntax* pSyntax;
|
||
|
||
rValue = _T("<No value>");
|
||
|
||
bOK = BringRowInBuffer( nRow );
|
||
if( bOK )
|
||
{
|
||
bstrColumnName = AllocBSTR( strColumn.GetBuffer( 256 ) );
|
||
|
||
hResult = m_pSearch->GetColumn( m_hSearch,
|
||
bstrColumnName,
|
||
&aSearchColumn );
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
aAttrDef.pszAttrName = aSearchColumn.pszAttrName;
|
||
aAttrDef.dwADsType = aSearchColumn.dwADsType;
|
||
aAttrDef.pADsValues = aSearchColumn.pADsValues;
|
||
aAttrDef.dwNumValues = aSearchColumn.dwNumValues;
|
||
pSyntax = NULL;
|
||
|
||
pSyntax = GetSyntaxHandler( aAttrDef.dwADsType, rValue );
|
||
|
||
if( pSyntax )
|
||
{
|
||
hResult = pSyntax->Native2Value( &aAttrDef, rValue );
|
||
delete pSyntax;
|
||
}
|
||
|
||
hResult = m_pSearch->FreeColumn( &aSearchColumn );
|
||
}
|
||
|
||
SysFreeString( bstrColumnName );
|
||
}
|
||
|
||
return bOK;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsSearchDataSource::GetADsPath
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::GetADsPath( int nRow, CString& rPath )
|
||
{
|
||
ASSERT( nRow < m_ADsPath.GetSize( ) );
|
||
|
||
if( ! (nRow < m_ADsPath.GetSize( ) ) )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
rPath = m_ADsPath.GetAt( nRow );
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsSearchDataSource::GetColumnText
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::GetColumnText( int nRow, int nColumn, CString& rColumn )
|
||
{
|
||
BOOL bOK = TRUE;
|
||
|
||
bOK = BringRowInBuffer( nRow );
|
||
if( bOK )
|
||
{
|
||
rColumn = m_strColumns[ nColumn ];
|
||
}
|
||
|
||
return bOK;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsSearchDataSource::RunTheQuery
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::RunTheQuery( void )
|
||
{
|
||
HRESULT hResult;
|
||
HCURSOR aCursor, oldCursor;
|
||
|
||
aCursor = LoadCursor( NULL, IDC_WAIT );
|
||
oldCursor = SetCursor( aCursor );
|
||
while( TRUE )
|
||
{
|
||
|
||
hResult = CreateSearchInterface( );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
hResult = SetSearchPreferences( );
|
||
if( FAILED( hResult ) )
|
||
break;
|
||
|
||
hResult = SetAttributesName( );
|
||
break;
|
||
}
|
||
SetCursor( oldCursor );
|
||
|
||
m_bNoMoreData = FALSE;
|
||
|
||
return (S_OK == hResult);
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function: CADsSearchDataSource::SetAttributesName
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
HRESULT CADsSearchDataSource::SetAttributesName( void )
|
||
{
|
||
HRESULT hResult = E_FAIL;
|
||
BSTR bstrSearchFilter;
|
||
DWORD dwNumAttributes = (DWORD)-1;
|
||
BSTR ppszAttributes[ 128 ];
|
||
int nIterator;
|
||
TCHAR szAttribute[ 128 ];
|
||
CString strAttr;
|
||
CString strAttributes;
|
||
|
||
bstrSearchFilter = AllocBSTR( m_pSearchPref->szQuery );
|
||
strAttributes = m_pSearchPref->szAttributes;
|
||
|
||
// first, we need to figure out how many attributes are requested
|
||
strAttributes.TrimLeft( );
|
||
strAttributes.TrimRight( );
|
||
|
||
if( strAttributes.CompareNoCase( _T("*") ) )
|
||
{
|
||
dwNumAttributes = 1;
|
||
_tcscpy( szAttribute, _T("") );
|
||
|
||
for( nIterator = 0; nIterator < strAttributes.GetLength( ) ; nIterator++ )
|
||
{
|
||
if( strAttributes[ nIterator ] == _T(',') )
|
||
{
|
||
strAttr = szAttribute;
|
||
strAttr.TrimLeft( );
|
||
strAttr.TrimRight( );
|
||
|
||
ppszAttributes[ dwNumAttributes - 1 ] = AllocBSTR( strAttr.GetBuffer( 128 ) );
|
||
dwNumAttributes++;
|
||
_tcscpy( szAttribute, _T("") );
|
||
}
|
||
else
|
||
{
|
||
TCHAR szChars[ 2 ];
|
||
|
||
szChars[ 1 ] = _T('\0');
|
||
szChars[ 0 ] = strAttributes[ nIterator ];
|
||
_tcscat( szAttribute, szChars );
|
||
|
||
if( nIterator == strAttributes.GetLength( ) - 1 )
|
||
{
|
||
strAttr = szAttribute;
|
||
strAttr.TrimLeft( );
|
||
strAttr.TrimRight( );
|
||
|
||
ppszAttributes[ dwNumAttributes - 1 ] = AllocBSTR( strAttr.GetBuffer( 128 ) );
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
hResult = m_pSearch->ExecuteSearch(
|
||
bstrSearchFilter,
|
||
ppszAttributes,
|
||
dwNumAttributes,
|
||
&m_hSearch
|
||
);
|
||
|
||
if( FAILED( hResult ) )
|
||
{
|
||
TRACE(_T("ExecuteSearch failed with %lx \n"), hResult);
|
||
AfxMessageBox( _T("ExecuteSearch failed") );
|
||
}
|
||
|
||
for( nIterator = 0; nIterator < (int)dwNumAttributes ; nIterator++ )
|
||
{
|
||
SysFreeString( ppszAttributes[ nIterator ] );
|
||
}
|
||
|
||
SysFreeString( bstrSearchFilter );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
/*HRESULT CADsSearchDataSource::SetSearchPreferences( )
|
||
{
|
||
CSearchPreferencesDlg aSearchPref;
|
||
ADS_SEARCHPREF_INFO arrSearchPref[ 20 ];
|
||
int nSearchPrefCount = 0;
|
||
HRESULT hResult;
|
||
|
||
if( aSearchPref.DoModal( ) != IDOK )
|
||
{
|
||
return E_FAIL;
|
||
}
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strAsynchronous.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_ASYNCHRONOUS;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType= ADSTYPE_BOOLEAN;
|
||
if( !aSearchPref.m_strAsynchronous.CompareNoCase( _T("Yes") ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Boolean = TRUE;
|
||
}
|
||
else
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Boolean = FALSE;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strAttributesOnly.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_ATTRIBTYPES_ONLY;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_BOOLEAN;
|
||
if( !aSearchPref.m_strAttributesOnly.CompareNoCase( _T("Yes") ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Boolean = TRUE;
|
||
}
|
||
else
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Boolean = FALSE;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strDerefAliases.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_DEREF_ALIASES;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType= ADSTYPE_INTEGER;
|
||
if( !aSearchPref.m_strDerefAliases.CompareNoCase( _T("Yes") ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_DEREF_ALWAYS;
|
||
}
|
||
else
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_DEREF_NEVER;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strTimeOut.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_TIMEOUT;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = _ttoi( aSearchPref.m_strTimeOut.GetBuffer( 16 ) );
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strTimeLimit.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_TIME_LIMIT;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = _ttoi( aSearchPref.m_strTimeLimit.GetBuffer( 16 ) );
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strSizeLimit.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = _ttoi( aSearchPref.m_strSizeLimit.GetBuffer( 16 ) );
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strPageSize.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = _ttoi( aSearchPref.m_strPageSize.GetBuffer( 16 ) );
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( !aSearchPref.m_strScope.IsEmpty( ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
if (!aSearchPref.m_strScope.CompareNoCase( _T("Base" ) ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_SCOPE_BASE;
|
||
}
|
||
if (!aSearchPref.m_strScope.CompareNoCase( _T("OneLevel" ) ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_SCOPE_ONELEVEL;
|
||
}
|
||
if (!aSearchPref.m_strScope.CompareNoCase( _T("Subtree" ) ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_SCOPE_SUBTREE;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
hResult = m_pSearch->SetSearchPreference( arrSearchPref, nSearchPrefCount );
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
return hResult;
|
||
|
||
} */
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
HRESULT CADsSearchDataSource::SetSearchPreferences( )
|
||
{
|
||
ADS_SEARCHPREF_INFO arrSearchPref[ 20 ];
|
||
int nSearchPrefCount = 0;
|
||
HRESULT hResult;
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nAsynchronous )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_ASYNCHRONOUS;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType= ADSTYPE_BOOLEAN;
|
||
arrSearchPref[nSearchPrefCount].vValue.Boolean = (BOOLEAN) m_pSearchPref->nAsynchronous;
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nAttributesOnly )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_ATTRIBTYPES_ONLY;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_BOOLEAN;
|
||
arrSearchPref[nSearchPrefCount].vValue.Boolean = (BOOLEAN) m_pSearchPref->nAttributesOnly;
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nDerefAliases )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_DEREF_ALIASES;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType= ADSTYPE_INTEGER;
|
||
if( m_pSearchPref->nDerefAliases )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_DEREF_ALWAYS;
|
||
}
|
||
else
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_DEREF_NEVER;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nTimeOut )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_TIMEOUT;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = m_pSearchPref->nTimeOut;
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nTimeLimit )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_TIME_LIMIT;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = m_pSearchPref->nTimeLimit;
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nSizeLimit )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_SIZE_LIMIT;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = m_pSearchPref->nSizeLimit;
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nPageSize )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = m_pSearchPref->nPageSize;
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
//***************************************************************************
|
||
if( _tcslen( m_pSearchPref->szScope ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_SEARCH_SCOPE;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
if( !_tcsicmp( m_pSearchPref->szScope, _T("Base" ) ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_SCOPE_BASE;
|
||
}
|
||
if( !_tcsicmp( m_pSearchPref->szScope, _T("OneLevel" ) ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_SCOPE_ONELEVEL;
|
||
}
|
||
if( !_tcsicmp( m_pSearchPref->szScope, _T("Subtree" ) ) )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_SCOPE_SUBTREE;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
|
||
//***************************************************************************
|
||
if( -1 != m_pSearchPref->nChaseReferrals )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].dwSearchPref = ADS_SEARCHPREF_CHASE_REFERRALS;
|
||
arrSearchPref[nSearchPrefCount].vValue.dwType = ADSTYPE_INTEGER;
|
||
if( m_pSearchPref->nChaseReferrals )
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_CHASE_REFERRALS_ALWAYS;
|
||
}
|
||
else
|
||
{
|
||
arrSearchPref[nSearchPrefCount].vValue.Integer = ADS_CHASE_REFERRALS_NEVER;
|
||
}
|
||
nSearchPrefCount++;
|
||
}
|
||
|
||
hResult = m_pSearch->SetSearchPreference( arrSearchPref, nSearchPrefCount );
|
||
|
||
ASSERT( S_OK == hResult );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
HRESULT CADsSearchDataSource::CreateSearchInterface( )
|
||
{
|
||
BSTR bstrPath;
|
||
HRESULT hResult = E_FAIL;
|
||
|
||
bstrPath = AllocBSTR( m_pSearchPref->szSource );
|
||
|
||
if( _tcslen( m_pSearchPref->szUserName ) )
|
||
{
|
||
BSTR bstrOpenAs;
|
||
BSTR bstrPassword;
|
||
LONG lControlCode = 0L;
|
||
|
||
bstrOpenAs = AllocBSTR( m_pSearchPref->szUserName );
|
||
bstrPassword = AllocBSTR( m_pSearchPref->szPassword );
|
||
|
||
if( m_pSearchPref->bEncryptPassword )
|
||
lControlCode = lControlCode | ADS_SECURE_AUTHENTICATION;
|
||
|
||
hResult = ADsOpenObject( bstrPath,
|
||
_wcsicmp( bstrOpenAs, L"NULL" ) ? bstrOpenAs : NULL,
|
||
_wcsicmp( bstrPassword, L"NULL" ) ? bstrPassword : NULL,
|
||
lControlCode, IID_IDirectorySearch, (void**)&m_pSearch );
|
||
SysFreeString( bstrOpenAs );
|
||
SysFreeString( bstrPassword );
|
||
}
|
||
else
|
||
{
|
||
hResult = ADsGetObject( bstrPath, IID_IDirectorySearch, (void**)&m_pSearch );
|
||
}
|
||
|
||
ASSERT( SUCCEEDED( hResult ) );
|
||
|
||
SysFreeString( bstrPath );
|
||
|
||
return hResult;
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::BringRowInBuffer( int nRow )
|
||
{
|
||
HRESULT hResult = E_FAIL;
|
||
|
||
if( NULL == m_pSearch )
|
||
{
|
||
m_bNoMoreData = TRUE;
|
||
}
|
||
|
||
if( m_bNoMoreData )
|
||
return FALSE;
|
||
|
||
if( m_nCurrentRow == nRow )
|
||
return TRUE;
|
||
|
||
if( m_nCurrentRow != -1 )
|
||
{
|
||
ASSERT( nRow >= m_nCurrentRow );
|
||
}
|
||
|
||
while( m_nCurrentRow != nRow )
|
||
{
|
||
m_bNoMoreData = TRUE;
|
||
TRACE( _T("Asking for row %d\n"), m_nCurrentRow + 1);
|
||
hResult = m_pSearch->GetNextRow( m_hSearch );
|
||
if( hResult != S_OK )
|
||
break;
|
||
m_bNoMoreData = FALSE;
|
||
|
||
if( hResult == S_ADS_NOMORE_ROWS )
|
||
{
|
||
m_bNoMoreData = TRUE;
|
||
}
|
||
|
||
m_nCurrentRow++;
|
||
}
|
||
|
||
if( hResult == S_OK )
|
||
{
|
||
ReadColumnNames( nRow );
|
||
}
|
||
|
||
return ( hResult == S_OK );
|
||
}
|
||
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
BOOL CADsSearchDataSource::ReadColumnNames( int nRow )
|
||
{
|
||
HRESULT hResult = E_FAIL;
|
||
WCHAR* pszColumnName;
|
||
TCHAR szColumn[ 256 ];
|
||
|
||
ASSERT( nRow == m_nCurrentRow );
|
||
if( nRow != m_nCurrentRow )
|
||
{
|
||
return FALSE;
|
||
}
|
||
|
||
m_strColumns.RemoveAll( );
|
||
ReadADsPath( );
|
||
|
||
while( TRUE )
|
||
{
|
||
hResult = m_pSearch->GetNextColumnName( m_hSearch, &pszColumnName );
|
||
//if( SUCCEEDED( hResult ) )
|
||
if( S_OK == hResult )
|
||
{
|
||
Convert( szColumn, pszColumnName );
|
||
m_strColumns.Add( szColumn );
|
||
FreeADsStr( pszColumnName );
|
||
}
|
||
//if( FAILED( hResult ) )
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
/*****************************************************************************
|
||
Function:
|
||
Arguments:
|
||
Return:
|
||
Purpose:
|
||
Author(s):
|
||
Revision:
|
||
Date:
|
||
*****************************************************************************/
|
||
void CADsSearchDataSource::ReadADsPath( void )
|
||
{
|
||
HRESULT hResult;
|
||
BSTR bstrColumnName;
|
||
ADS_SEARCH_COLUMN aSearchColumn;
|
||
ADS_ATTR_INFO aAttrDef;
|
||
BOOL bOK = TRUE;
|
||
COleDsSyntax* pSyntax;
|
||
CString rValue = _T("");
|
||
|
||
bstrColumnName = AllocBSTR( _T("ADsPath") );
|
||
|
||
hResult = m_pSearch->GetColumn( m_hSearch,
|
||
bstrColumnName,
|
||
&aSearchColumn );
|
||
SysFreeString( bstrColumnName );
|
||
|
||
if( SUCCEEDED( hResult ) )
|
||
{
|
||
aAttrDef.pszAttrName = aSearchColumn.pszAttrName;
|
||
aAttrDef.dwADsType = aSearchColumn.dwADsType;
|
||
aAttrDef.pADsValues = aSearchColumn.pADsValues;
|
||
aAttrDef.dwNumValues = aSearchColumn.dwNumValues;
|
||
|
||
pSyntax = new COleDsBSTR;
|
||
|
||
hResult = pSyntax->Native2Value( &aAttrDef, rValue );
|
||
delete pSyntax;
|
||
|
||
hResult = m_pSearch->FreeColumn( &aSearchColumn );
|
||
}
|
||
|
||
m_ADsPath.Add( rValue );
|
||
}
|
||
|
||
|