WindowsXP-SP1/ds/adsi/oledsvw/csyntax.cpp

4613 lines
119 KiB
C++

#include "stdafx.h"
//#include "inds.h"
#include <limits.h>
#include "ole2.h"
#include "csyntax.h"
#define NDS_SEPARATOR _T('&')
#define NDS_SEPARATOR_S _T(" & ")
#define NDS_SEPARATOR_W L'&'
#define NDS_SEPARATOR_A '&'
/***********************************************************
Function: GetSyntaxHandler
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsSyntax* GetSyntaxHandler( WCHAR* pszSyntax )
{
ADSTYPE eType;
CString strText;
eType = ADsTypeFromSyntaxString( pszSyntax );
return GetSyntaxHandler( eType, strText );
}
/***********************************************************
Function: GetSyntaxHandler
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsSyntax* GetSyntaxHandler( ADSTYPE eType, CString& rText )
{
COleDsSyntax* pSyntax = NULL;
switch( eType )
{
case ADSTYPE_INVALID:
ASSERT( FALSE );
rText = _T("ERROR: ADSTYPE_INVALID");
break;
case ADSTYPE_DN_STRING:
case ADSTYPE_CASE_EXACT_STRING:
case ADSTYPE_CASE_IGNORE_STRING:
case ADSTYPE_PRINTABLE_STRING:
case ADSTYPE_NUMERIC_STRING:
case ADSTYPE_OBJECT_CLASS:
pSyntax = new COleDsBSTR( );
break;
case ADSTYPE_BOOLEAN:
pSyntax = new COleDsBOOL( );
break;
case ADSTYPE_CASEIGNORE_LIST:
pSyntax = new COleDsNDSCaseIgnoreList( );
break;
case ADSTYPE_OCTET_LIST:
pSyntax = new COleDsNDSOctetList( );
break;
case ADSTYPE_PATH:
pSyntax = new COleDsNDSPath( );
break;
case ADSTYPE_NETADDRESS:
pSyntax = new COleDsNDSNetAddress( );
break;
case ADSTYPE_BACKLINK:
pSyntax = new COleDsNDSBackLink( );
break;
case ADSTYPE_HOLD:
pSyntax = new COleDsNDSHold( );
break;
case ADSTYPE_TYPEDNAME:
pSyntax = new COleDsNDSTypedName( );
break;
case ADSTYPE_INTEGER:
pSyntax = new COleDsLONG( );
break;
case ADSTYPE_LARGE_INTEGER:
pSyntax = new COleDsLargeInteger( );
break;
case ADSTYPE_POSTALADDRESS:
pSyntax = new COleDsNDSPostalAddress( );
break;
case ADSTYPE_OCTET_STRING:
pSyntax = new COleDsOctetString( );
break;
case ADSTYPE_UTC_TIME:
pSyntax = new COleDsDATE( );
break;
case ADSTYPE_TIMESTAMP:
pSyntax = new COleDsNDSTimeStamp;
break;
case ADSTYPE_EMAIL:
pSyntax = new COleDsNDSEMail;
break;
case ADSTYPE_FAXNUMBER:
pSyntax = new COleDsNDSFaxNumber;
break;
case ADSTYPE_PROV_SPECIFIC:
ASSERT( FALSE );
rText = _T("ADSTYPE_PROV_SPECIFIC");
break;
default:
ASSERT( FALSE );
rText = _T("ERROR Unknown ADSTYPE");
break;
}
return pSyntax;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsSyntax::COleDsSyntax( )
{
m_lType = VT_BSTR;
m_dwSyntaxID = ADSTYPE_DN_STRING;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsSyntax::VarToDisplayStringEx( VARIANT& var, BOOL bMultiValued )
{
VARIANT aVar;
HRESULT hResult;
CString strText = _T("ERROR");
VariantInit( &aVar );
if( !bMultiValued )
{
SAFEARRAY* pSafeArray;
TCHAR szText[ 8096 ];
VARIANT varString;
long lBound, uBound, lItem;
CString strResult;
ASSERT( VT_ARRAY & V_VT(&var ) );
if( !(VT_ARRAY & V_VT(&var) ) )
{
ERROR_HERE( szText );
}
else
{
VariantInit( &varString );
pSafeArray = V_ARRAY( &var );
hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound);
hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound);
ASSERT( lBound == uBound );
szText[ 0 ] = _T('\0');
lItem = lBound;
hResult = SafeArrayGetElement( pSafeArray, &lItem, &aVar );
if( FAILED( hResult ) )
{
ASSERT(FALSE);
}
if( !ConvertFromPropertyValue( aVar, szText ) )
{
hResult = VariantChangeType( &varString, &aVar, VARIANT_NOVALUEPROP, VT_BSTR );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
{
ERROR_HERE( szText );
}
else
{
Convert( szText, V_BSTR( &varString ) );
VariantClear( &varString );
}
VariantClear( &aVar );
}
}
return CString( szText );
}
else
{
strText = FromVariantArrayToString( var );
}
return strText;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsSyntax::VarToDisplayString( VARIANT& var, BOOL bMultiValued, BOOL bUseGetEx )
{
VARIANT aVar;
HRESULT hResult;
CString strText;
// we have to use GetEx style
if( bUseGetEx )
return VarToDisplayStringEx( var, bMultiValued );
// we're using Get
VariantInit( &aVar );
if( !bMultiValued )
{
hResult = VariantChangeType( &aVar, &var, VARIANT_NOVALUEPROP, VT_BSTR );
if( SUCCEEDED( hResult ) )
{
strText = V_BSTR( &aVar );
}
else
{
strText = _T("ERROR on conversion");
}
hResult = VariantClear( &aVar );
}
else
{
strText = FromVariantArrayToString( var );
}
return strText;
}
/***********************************************************
Function: COleDsSyntax::DisplayStringToDispParamsEx
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsSyntax::DisplayStringToDispParamsEx( CString& rText,
DISPPARAMS& dispParams,
BOOL bMultiValued )
{
HRESULT hResult;
dispParams.rgdispidNamedArgs[ 0 ] = DISPID_PROPERTYPUT;
dispParams.cArgs = 1;
dispParams.cNamedArgs = 1;
hResult = BuildVariantArray( m_lType, rText, dispParams.rgvarg[0] );
return SUCCEEDED( hResult );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsSyntax::DisplayStringToDispParams( CString& rText, DISPPARAMS& dispParams,
BOOL bMultiValued, BOOL bUseGetEx )
{
HRESULT hResult;
if( bUseGetEx )
{
return DisplayStringToDispParamsEx( rText, dispParams, bMultiValued );
}
dispParams.rgdispidNamedArgs[ 0 ] = DISPID_PROPERTYPUT;
dispParams.cArgs = 1;
dispParams.cNamedArgs = 1;
if( bMultiValued )
{
hResult = BuildVariantArray( m_lType, rText, dispParams.rgvarg[0] );
}
else
{
VARIANT vStr;
VariantInit( &vStr );
VariantInit( &dispParams.rgvarg[0] );
V_VT( &vStr ) = VT_BSTR;
V_BSTR( &vStr ) = AllocBSTR( rText.GetBuffer( 1024 ) );
hResult = VariantChangeType( &dispParams.rgvarg[0], &vStr, VARIANT_NOVALUEPROP, m_lType );
VariantClear( &vStr );
}
return SUCCEEDED( hResult );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsSyntax::Native2Value( ADSVALUE* pADsObject, CString& rVal )
{
ASSERT( FALSE );
return E_FAIL;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsSyntax::Value2Native( ADSVALUE* pADsObject, CString& rVal )
{
ASSERT( FALSE );
return E_FAIL;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsSyntax::FreeAttrValue ( ADSVALUE* pADsValue )
{
return;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsSyntax::FreeAttrInfo( ADS_ATTR_INFO* pAttrInfo )
{
DWORD dwIter;
ASSERT( NULL != pAttrInfo->pszAttrName );
FREE_MEMORY( pAttrInfo->pszAttrName );
if( ADS_ATTR_CLEAR == pAttrInfo->dwControlCode )
return;
for( dwIter = 0;
NULL != pAttrInfo->pADsValues && dwIter < pAttrInfo->dwNumValues ;
dwIter++ )
{
FreeAttrValue( pAttrInfo->pADsValues + dwIter );
}
FREE_MEMORY( pAttrInfo->pADsValues );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsSyntax::Native2Value( ADS_ATTR_INFO* pAttr, CString& rVal )
{
HRESULT hResult = E_FAIL;
CString strItem;
ADSVALUE* pAdsValue;
rVal.Empty( );
while( TRUE )
{
ASSERT( pAttr );
if( !pAttr )
break;
ASSERT( pAttr->pADsValues );
if( !pAttr->pADsValues )
break;
for( DWORD dwIdx = 0L; dwIdx < pAttr->dwNumValues ; dwIdx++ )
{
if( dwIdx )
rVal = rVal + SEPARATOR_S;
pAdsValue = pAttr->pADsValues + dwIdx;
if( ADSTYPE_INVALID != pAdsValue->dwType )
{
hResult = Native2Value( pAdsValue, strItem );
}
else
{
strItem = _T("ERROR: ADSTYPE_INVALID");
TRACE( _T("ERROR: Got ADSTYPE_INVALID!!!\n") );
}
rVal = rVal + strItem;
}
break;
}
return hResult;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsSyntax::Value2Native( ADS_ATTR_INFO* pAttr, CString& rVal )
{
HRESULT hResult = E_FAIL;
CString strItem;
ADSVALUE* pCurrentADsObject;
DWORD dwValues;
DWORD dwIdx;
pAttr->dwADsType = (ADSTYPE)m_dwSyntaxID;
while( TRUE )
{
ASSERT( pAttr );
if( !pAttr )
break;
dwValues = GetValuesCount( rVal, SEPARATOR_C );
pAttr->dwNumValues = dwValues;
pAttr->pADsValues = (ADSVALUE*)AllocADsMem( sizeof( ADSVALUE ) * dwValues );
pCurrentADsObject = pAttr->pADsValues;
for( dwIdx = 0L; dwIdx < dwValues ; dwIdx++ )
{
strItem = GetValueByIndex( rVal, SEPARATOR_C, dwIdx );
pCurrentADsObject->dwType = (ADSTYPE)m_dwSyntaxID;
hResult = Value2Native( pCurrentADsObject, strItem );
pCurrentADsObject++;
}
break;
}
return hResult;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
DWORD COleDsSyntax::GetValuesCount( CString& rString, TCHAR cSeparator )
{
DWORD dwValues;
DWORD dwIdx;
dwValues = 1L;
for( dwIdx = 0L; dwIdx < (DWORD)rString.GetLength( ) ; dwIdx++ )
{
TCHAR cCurrent;
cCurrent = rString.GetAt( dwIdx );
if( cCurrent == cSeparator )
{
dwValues++;
}
}
return dwValues;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsSyntax::GetValueByIndex( CString& rVal, TCHAR cSeparator, DWORD dwIndex )
{
DWORD dwParsed = 0L;
DWORD dwIter = 0L;
DWORD dwSize;
CString strItem;
dwSize = rVal.GetLength( );
while( dwIter < dwSize && dwParsed < dwIndex && rVal.GetAt(dwIter) )
{
if( cSeparator == rVal.GetAt(dwIter++) )
dwParsed++;
}
while( dwIter < dwSize && cSeparator != rVal.GetAt(dwIter) )
{
strItem += rVal.GetAt(dwIter++);
}
strItem.TrimLeft( );
return strItem;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsBSTR::COleDsBSTR( )
{
m_lType = VT_BSTR;
m_dwSyntaxID = ADSTYPE_DN_STRING;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsBSTR::Native2Value( ADSVALUE* pAdsValue, CString& rVal )
{
TCHAR szBuffer[ 1024 ];
if( pAdsValue->DNString )
{
Convert( szBuffer, pAdsValue->DNString );
}
else
{
_tcscpy( szBuffer, _T("NULL value") );
}
rVal = szBuffer;
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsBSTR::Value2Native( ADSVALUE* pADsObject, CString& rVal )
{
LPWSTR lpwszValue;
lpwszValue = (LPWSTR) AllocADsMem( sizeof(WCHAR) * ( rVal.GetLength( ) + 1 ) );
Convert( lpwszValue, rVal.GetBuffer( 1024 ) );
pADsObject->DNString = lpwszValue;
return S_OK;
}
/***********************************************************
Function: COleDsBSTR::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsBSTR::FreeAttrValue ( ADSVALUE* pADsValue )
{
ASSERT( NULL != pADsValue->DNString );
FREE_MEMORY( pADsValue->DNString );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsBOOL::COleDsBOOL( )
{
m_lType = VT_BOOL;
m_dwSyntaxID = ADSTYPE_BOOLEAN;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsBOOL::Native2Value( ADSVALUE* pADsObject, CString& rVal )
{
BOOL bVal;
bVal = pADsObject->Boolean;
rVal = ( bVal ? _T("1") : _T("0") );
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsBOOL::Value2Native( ADSVALUE* pADsObject, CString& rVal )
{
pADsObject->Boolean =
rVal.Compare( _T("0") ) ? TRUE : FALSE;
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsLONG::COleDsLONG( )
{
m_lType = VT_I4;
m_dwSyntaxID = ADSTYPE_INTEGER;
}
/***********************************************************
Function: COleDsLONG::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsLONG::Native2Value( ADSVALUE* pADsObject, CString& rVal )
{
DWORD dwVal;
TCHAR szText[ 16 ];
dwVal = pADsObject->Integer;
_ultot( dwVal, szText, 10 );
rVal = szText;
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsLONG::Value2Native( ADSVALUE* pADsObject, CString& rVal )
{
DWORD dwVal;
dwVal = (DWORD)_ttol( rVal.GetBuffer( 128 ) );
pADsObject->Integer = dwVal ;
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsLargeInteger::COleDsLargeInteger( )
{
m_lType = VT_I8;
m_dwSyntaxID = ADSTYPE_LARGE_INTEGER;
}
/******************************************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
******************************************************************************/
HRESULT COleDsLargeInteger::Native2Value( ADSVALUE* pValue, CString& rValue)
{
HRESULT hResult;
TCHAR szValue[ 32 ];
hResult = LARGE_INTEGERToString( szValue, &pValue->LargeInteger );
ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) )
{
rValue = szValue;
}
return hResult;
}
/******************************************************************************
Function: COleDsLargeInteger::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
******************************************************************************/
HRESULT COleDsLargeInteger::Value2Native( ADSVALUE* pValue, CString& rValue )
{
HRESULT hResult;
hResult = LARGE_INTEGERToString( rValue.GetBuffer( 128 ), &pValue->LargeInteger );
return hResult;
}
/***********************************************************
Function: COleDsLargeInteger::DisplayStringToDispParamsEx
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsLargeInteger::DisplayStringToDispParamsEx( CString& rText,
DISPPARAMS& dispParams,
BOOL bMultiValued )
{
SAFEARRAY* pSArray;
SAFEARRAYBOUND saBound;
HRESULT hResult;
LONG lIdx = LBOUND;
DisplayStringToDispParams( rText, dispParams, bMultiValued, FALSE );
if( !bMultiValued )
{
saBound.lLbound = LBOUND;
saBound.cElements = 1;
pSArray = SafeArrayCreate( VT_VARIANT, 1, &saBound );
hResult = SafeArrayPutElement( pSArray, &lIdx, &dispParams.rgvarg[0] );
VariantClear( &dispParams.rgvarg[0] );
V_VT( &dispParams.rgvarg[0] ) = VT_ARRAY | VT_VARIANT;
V_ARRAY( &dispParams.rgvarg[0] ) = pSArray;
}
return TRUE;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsLargeInteger::DisplayStringToDispParams( CString& rText,
DISPPARAMS& dispParams,
BOOL bMultiValued,
BOOL bUseEx )
{
HRESULT hResult = E_FAIL;
int x= 0;
if( bUseEx )
{
return DisplayStringToDispParamsEx( rText, dispParams, bMultiValued );
}
dispParams.rgdispidNamedArgs[ 0 ] = DISPID_PROPERTYPUT;
dispParams.cArgs = 1;
dispParams.cNamedArgs = 1;
if( bMultiValued )
{
SAFEARRAY* psa;
SAFEARRAYBOUND sab;
long lItems = 0;
int lIdx;
HRESULT hResult;
rText.MakeUpper( );
lItems = GetValuesCount( rText, SEPARATOR_C );
sab.cElements = lItems;
sab.lLbound = LBOUND;
psa = SafeArrayCreate( VT_VARIANT, 1, &sab );
ASSERT( NULL != psa );
if ( psa )
{
for( lIdx = LBOUND; lIdx < ( LBOUND + lItems ) ; lIdx++ )
{
VARIANT var;
CString strTemp;
strTemp = GetValueAt( rText, SEPARATOR_C, lIdx - LBOUND );
V_VT( &var ) = VT_DISPATCH;
V_DISPATCH( &var ) = CreateLargeInteger( strTemp );
hResult = SafeArrayPutElement( psa, (long FAR *)&lIdx, &var );
VariantClear( &var );
}
V_VT( &dispParams.rgvarg[0] ) = VT_VARIANT | VT_ARRAY;
V_ARRAY( &dispParams.rgvarg[0] ) = psa;
}
}
else
{
IDispatch* pDisp = NULL;
hResult = S_OK;
pDisp = CreateLargeInteger( rText );
V_VT( &dispParams.rgvarg[0] ) = VT_DISPATCH;
V_DISPATCH( &dispParams.rgvarg[0] ) = pDisp;
}
return SUCCEEDED( hResult );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsLargeInteger::VarToDisplayStringEx( VARIANT& var,
BOOL bMultiValued )
{
SAFEARRAY* pSArray;
HRESULT hResult;
LONG uLow, uHigh, uIndex;
VARIANT vItem;
CString strVal;
CString strTemp;
pSArray = V_ARRAY( &var );
hResult = SafeArrayGetLBound( pSArray, 1, &uLow );
hResult = SafeArrayGetUBound( pSArray, 1, &uHigh );
if( !bMultiValued )
{
ASSERT( uLow == uHigh );
}
for( uIndex = uLow; uIndex <= uHigh; uIndex++ )
{
if( uIndex != uLow )
{
strVal += SEPARATOR_S;
}
VariantInit( &vItem );
hResult = SafeArrayGetElement( pSArray, &uIndex, &vItem );
ASSERT( SUCCEEDED( hResult ) );
strTemp = FromLargeInteger( V_DISPATCH( &vItem ) );
VariantClear( &vItem );
strVal += strTemp;
if( strVal.GetLength( ) > 8096 )
break;
}
return strVal;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsLargeInteger::VarToDisplayString( VARIANT& var,
BOOL bMultiValued,
BOOL bUseEx )
{
if( bUseEx )
{
return VarToDisplayStringEx( var, bMultiValued );
}
if( bMultiValued )
{
return VarToDisplayStringEx( var, TRUE );
}
else
{
return FromLargeInteger( V_DISPATCH( &var ) );
}
}
/******************************************************************************
Function: COleDsDATE::COleDsDATE
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
******************************************************************************/
COleDsDATE::COleDsDATE( )
{
m_lType = VT_DATE;
m_dwSyntaxID = ADSTYPE_UTC_TIME;
}
/******************************************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
******************************************************************************/
HRESULT COleDsDATE::Native2Value( ADSVALUE* pADsObject, CString& rVal )
{
DATE aDate;
ADS_UTC_TIME aUTCTime;
HRESULT hResult;
aUTCTime = pADsObject->UTCTime;
hResult = SystemTimeToVariantTime( (SYSTEMTIME*) &aUTCTime, &aDate );
if( SUCCEEDED( hResult ) )
{
VARIANT aVar;
VARIANT vText;
VariantInit( &aVar );
VariantInit( &vText );
V_VT( &aVar ) = VT_DATE;
V_DATE( &aVar ) = aDate;
hResult = VariantChangeType( &vText, &aVar, VARIANT_NOVALUEPROP, VT_BSTR );
if( SUCCEEDED( hResult ) )
{
TCHAR szText[ 128 ];
Convert( szText, V_BSTR( &vText ) );
rVal = szText;
VariantClear( &vText );
}
}
return hResult;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsDATE::Value2Native( ADSVALUE* pADsObject, CString& rVal )
{
DATE aDate;
ADS_UTC_TIME aUTCTime;
HRESULT hResult;
VARIANT vDate;
VARIANT vText;
VariantInit( &vText );
VariantInit( &vDate );
V_VT( &vText ) = VT_BSTR;
V_BSTR( &vText ) = AllocBSTR( rVal.GetBuffer( 128 ) );
hResult = VariantChangeType( &vDate, &vText, VARIANT_NOVALUEPROP, VT_DATE );
VariantClear( &vText );
if( SUCCEEDED( hResult ) )
{
aDate = V_DATE( &vDate );
hResult = VariantTimeToSystemTime( aDate, (SYSTEMTIME*) &aUTCTime );
pADsObject->UTCTime = aUTCTime;
}
return hResult;
}
/***********************************************************
Function: COleDsNDSOctetList::COleDsNDSOctetList
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSCaseIgnoreList::COleDsNDSCaseIgnoreList( )
{
m_dwSyntaxID = ADSTYPE_CASEIGNORE_LIST;
}
/***********************************************************
Function: COleDsNDSCaseIgnoreList::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSCaseIgnoreList::Native2Value( ADSVALUE* pValue,
CString& rText )
{
ADS_CASEIGNORE_LIST* pStringList;
int nIdx;
ASSERT( ADSTYPE_CASEIGNORE_LIST == pValue->dwType );
if( ADSTYPE_CASEIGNORE_LIST != pValue->dwType )
{
rText = _T("ERROR: ADSTYPE_CASEIGNORE_LIST != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
pStringList = pValue->pCaseIgnoreList;
while( NULL != pStringList && NULL != pStringList->String )
{
TCHAR* pszText;
if( 0 != nIdx )
rText = rText + NDS_SEPARATOR;
nIdx = 1;
pszText = AllocTCHAR( pStringList->String );
if( NULL != pszText )
{
rText = rText + pszText;
FreeADsMem( pszText );
}
pStringList = pStringList->Next;
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSCaseIgnoreList::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSCaseIgnoreList::Value2Native( ADSVALUE* pValue,
CString& rText )
{
HRESULT hResult = E_FAIL;
DWORD dwValues, dwItem;
CString strItem;
ADS_CASEIGNORE_LIST** ppItem;
pValue->dwType = ADSTYPE_CASEIGNORE_LIST;
pValue->pCaseIgnoreList = NULL;
dwValues = GetValuesCount( rText, NDS_SEPARATOR );
ppItem = &(pValue->pCaseIgnoreList);
for( dwItem = 0; dwItem < dwValues ; dwItem++ )
{
strItem = GetValueByIndex( rText, NDS_SEPARATOR, dwItem );
*ppItem = (ADS_CASEIGNORE_LIST*) AllocADsMem( sizeof( ADS_CASEIGNORE_LIST ) );
(*ppItem)->String = AllocWCHAR( strItem.GetBuffer( strItem.GetLength( ) ) );
(*ppItem)->Next = NULL;
ppItem = &((*ppItem)->Next );
}
if( dwValues == 0 )
{
pValue->pCaseIgnoreList = (ADS_CASEIGNORE_LIST*) AllocADsMem( sizeof( ADS_CASEIGNORE_LIST ) );
pValue->pCaseIgnoreList->String = NULL;
pValue->pCaseIgnoreList->Next = NULL;
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSCaseIgnoreList::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSCaseIgnoreList::FreeAttrValue( ADSVALUE* pValue )
{
ADS_CASEIGNORE_LIST* pStringList;
ADS_CASEIGNORE_LIST* pSaveStringList;
pStringList = pValue->pCaseIgnoreList;
while( NULL != pStringList )
{
FREE_MEMORY( pStringList->String );
pSaveStringList = pStringList;
pStringList = pStringList->Next;
FREE_MEMORY( pSaveStringList );
}
}
/***********************************************************
Function: COleDsNDSCaseIgnoreList::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSCaseIgnoreList::String_2_VARIANT( TCHAR* pszText,
VARIANT& rValue )
{
HRESULT hResult = E_FAIL;
CString strItem;
VARIANT vVal;
IADsCaseIgnoreList* pCaseIgnoreList = NULL;
IDispatch* pDisp = NULL;
VariantInit( &vVal );
VariantInit( &rValue );
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_CaseIgnoreList,
NULL,
CLSCTX_ALL,
IID_IADsCaseIgnoreList,
(void **)&pCaseIgnoreList );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strItem = pszText;
hResult = BuildVariantArray( VT_BSTR,
strItem,
vVal,
NDS_SEPARATOR );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pCaseIgnoreList->put_CaseIgnoreList( vVal );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pCaseIgnoreList->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
V_VT( &rValue ) = VT_DISPATCH;
V_DISPATCH( &rValue ) = pDisp;
break;
}
VariantClear( &vVal );
RELEASE( pCaseIgnoreList );
return hResult;
}
/***********************************************************
Function: COleDsNDSCaseIgnoreList::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSCaseIgnoreList::VARIANT_2_String( TCHAR* pszText,
VARIANT& rValue )
{
IADsCaseIgnoreList* pCaseIgnoreList = NULL;
HRESULT hResult;
VARIANT vValue;
CString strText;
VariantInit( &vValue );
while( TRUE )
{
hResult = V_DISPATCH( &rValue )->QueryInterface( IID_IADsCaseIgnoreList,
(void**)&pCaseIgnoreList );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pCaseIgnoreList->get_CaseIgnoreList( &vValue );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strText = FromVariantArrayToString( vValue, NDS_SEPARATOR_S );
_tcscpy( pszText, (LPCTSTR)strText );
break;
}
RELEASE( pCaseIgnoreList );
VariantClear( &vValue );
return hResult;
}
/***********************************************************
Function: COleDsNDSNetAddress::COleDsNDSNetAddress
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSNetAddress::COleDsNDSNetAddress( )
{
m_dwSyntaxID = ADSTYPE_NETADDRESS;
}
/***********************************************************
Function: COleDsNDSNetAddress::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSNetAddress::Native2Value( ADSVALUE* pValue, CString& rText )
{
ADS_NETADDRESS* pNetAddress;
TCHAR szText[ 16 ];
ASSERT( ADSTYPE_NETADDRESS == pValue->dwType );
if( ADSTYPE_NETADDRESS != pValue->dwType )
{
rText = _T("ERROR: ADSTYPE_NETADDRESS != pValue->dwType");
return E_FAIL;
}
if( NULL == pValue->pNetAddress )
{
rText = _T("ERROR: pValue->pNetAddress is NULL");
return E_FAIL;
}
pNetAddress = pValue->pNetAddress;
_ultot( pNetAddress->AddressType, szText, 10 );
rText = rText + SEPARATOR_S;
if( NULL != pNetAddress->Address )
{
rText = rText + Blob2String( pNetAddress->Address, pNetAddress->AddressLength );
}
else
{
rText = rText + _T("NULL");
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSNetAddress::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSNetAddress::Value2Native( ADSVALUE* pValue,
CString& rText )
{
HRESULT hResult = E_FAIL;
DWORD dwValues;
CString strAddressType;
CString strAddress;
pValue->dwType = ADSTYPE_NETADDRESS;
pValue->pNetAddress = NULL;
while( TRUE )
{
dwValues = GetValuesCount( rText, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
break;
}
pValue->pNetAddress = (ADS_NETADDRESS*) AllocADsMem( sizeof(ADS_NETADDRESS) );
if( NULL == pValue->pNetAddress )
break;
strAddressType = GetValueByIndex( rText, NDS_SEPARATOR, 0L );
strAddress = GetValueByIndex( rText, NDS_SEPARATOR, 1L );
hResult = String2Blob( strAddress.GetBuffer( strAddress.GetLength( ) ),
(void**) &(pValue->pNetAddress->Address),
&(pValue->pNetAddress->AddressLength) );
pValue->pNetAddress->AddressType = (DWORD)_ttol( (LPCTSTR)strAddressType );
break;
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSNetAddress::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSNetAddress::FreeAttrValue( ADSVALUE* pValue )
{
if( NULL != pValue->pNetAddress )
{
FREE_MEMORY( pValue->pNetAddress->Address );
}
FREE_MEMORY( pValue->pNetAddress );
}
/***********************************************************
Function: COleDsNDSNetAddress::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSNetAddress::String_2_VARIANT( TCHAR* pszText,
VARIANT& rValue )
{
HRESULT hResult = E_FAIL;
CString strItem;
CString strAddressType;
CString strAddress;
DWORD dwValues;
VARIANT vVal, vBlob;
IADsNetAddress* pNetAddress = NULL;
IDispatch* pDisp = NULL;
VariantInit( &vVal );
VariantInit( &vBlob );
VariantInit( &rValue );
strItem = pszText;
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_NetAddress,
NULL,
CLSCTX_ALL,
IID_IADsNetAddress,
(void **)&pNetAddress );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
dwValues = GetValuesCount( strItem, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
break;
}
strAddressType = GetValueByIndex( strItem, NDS_SEPARATOR, 0L );
strAddress = GetValueByIndex( strItem, NDS_SEPARATOR, 1L );
pNetAddress->put_AddressType( _ttol( (LPCTSTR)strAddressType ) );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = CreateBlobArray( strAddress, vBlob );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
pNetAddress->put_Address( vBlob );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pNetAddress->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
V_VT( &rValue ) = VT_DISPATCH;
V_DISPATCH( &rValue ) = pDisp;
break;
}
VariantClear( &vVal );
VariantClear( &vBlob );
RELEASE( pNetAddress );
return hResult;
}
/***********************************************************
Function: COleDsNDSNetAddress::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSNetAddress::VARIANT_2_String( TCHAR* pszText,
VARIANT& rValue )
{
IADsNetAddress* pNetAddress= NULL;
HRESULT hResult;
CString strText;
LONG lAddressType;
VARIANT vItem;
VariantInit( &vItem );
while( TRUE )
{
hResult = V_DISPATCH( &rValue )->QueryInterface( IID_IADsNetAddress,
(void**)&pNetAddress );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pNetAddress->get_Address( &vItem );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pNetAddress->get_AddressType( &lAddressType );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strText = FromVariantToString( vItem );
_ltot( lAddressType, pszText, 10 );
_tcscat( pszText, NDS_SEPARATOR_S ) ;
_tcscat( pszText, (LPCTSTR)strText );
break;
}
RELEASE( pNetAddress );
VariantClear( &vItem );
return hResult;
}
/***********************************************************
Function: COleDsNDSOctetList::COleDsNDSOctetList
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSOctetList::COleDsNDSOctetList( )
{
m_dwSyntaxID = ADSTYPE_OCTET_LIST;
}
/***********************************************************
Function: COleDsNDSOctetList::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSOctetList::Native2Value( ADSVALUE* pValue, CString& rText )
{
ADS_OCTET_LIST* pOctetString;
int nIdx;
ASSERT( ADSTYPE_OCTET_LIST == pValue->dwType );
if( ADSTYPE_OCTET_LIST != pValue->dwType )
{
rText = _T("ERROR: ADSTYPE_OCTET_LIST != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
pOctetString = pValue->pOctetList;
while( NULL != pOctetString && NULL != pOctetString->Data )
{
if( 0 != nIdx )
rText = rText + SEPARATOR_S;
nIdx = 1;
rText = rText + Blob2String( pOctetString->Data, (DWORD)pOctetString->Length );
pOctetString = pOctetString->Next;
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSOctetList::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSOctetList::Value2Native( ADSVALUE* pValue,
CString& rText )
{
HRESULT hResult = E_FAIL;
DWORD dwValues, dwItem;
CString strItem;
ADS_OCTET_LIST** ppItem;
pValue->dwType = ADSTYPE_OCTET_LIST;
pValue->pOctetList = NULL;
dwValues = GetValuesCount( rText, NDS_SEPARATOR );
ppItem = &(pValue->pOctetList);
for( dwItem = 0; dwItem < dwValues ; dwItem++ )
{
strItem = GetValueByIndex( rText, NDS_SEPARATOR, dwItem );
*ppItem = (ADS_OCTET_LIST*) AllocADsMem( sizeof( ADS_OCTET_LIST ) );
hResult = String2Blob( strItem.GetBuffer( strItem.GetLength( ) ),
(void**) &((*ppItem)->Data),
&((*ppItem)->Length) );
ASSERT( SUCCEEDED( hResult ) );
(*ppItem)->Next = NULL;
ppItem = &((*ppItem)->Next );
}
if( dwValues == 0 )
{
pValue->pOctetList = (ADS_OCTET_LIST*) AllocADsMem( sizeof( ADS_OCTET_LIST ) );
pValue->pOctetList->Data = NULL;
pValue->pOctetList->Next = NULL;
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSOctetList::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSOctetList::FreeAttrValue( ADSVALUE* pValue )
{
ADS_OCTET_LIST* pOctetList;
ADS_OCTET_LIST* pSaveOctetList;
BOOL bMark;
pOctetList = pValue->pOctetList;
bMark = FALSE;
while( NULL != pOctetList )
{
FREE_MEMORY( pOctetList->Data );
pSaveOctetList = pOctetList;
pOctetList = pOctetList->Next;
FREE_MEMORY( pSaveOctetList );
}
}
/***********************************************************
Function: COleDsNDSOctetList::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSOctetList::String_2_VARIANT( TCHAR* pszText,
VARIANT& rValue )
{
HRESULT hResult = E_FAIL;
CString strItem;
VARIANT vVal;
IADsOctetList* pOctetList = NULL;
IDispatch* pDisp = NULL;
VariantInit( &vVal );
VariantInit( &rValue );
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_OctetList,
NULL,
CLSCTX_ALL,
IID_IADsOctetList,
(void **)&pOctetList );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strItem = pszText;
hResult = CreateBlobArrayEx( strItem, vVal, NDS_SEPARATOR );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pOctetList->put_OctetList( vVal );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pOctetList->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
V_VT( &rValue ) = VT_DISPATCH;
V_DISPATCH( &rValue ) = pDisp;
break;
}
VariantClear( &vVal );
RELEASE( pOctetList );
return hResult;
}
/***********************************************************
Function: COleDsNDSOctetList::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSOctetList::VARIANT_2_String( TCHAR* pszText,
VARIANT& rValue )
{
IADsOctetList* pOctetList= NULL;
HRESULT hResult;
VARIANT vValue;
CString strText;
LONG lItems, lIdx;
VARIANT vItem;
VariantInit( &vValue );
*pszText = '\0';
while( TRUE )
{
hResult = V_DISPATCH( &rValue )->QueryInterface( IID_IADsOctetList,
(void**)&pOctetList );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
hResult = pOctetList->get_OctetList( &vValue );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
lItems = GetVARIANTSize ( vValue );
for( lIdx = 0; lIdx < lItems ; lIdx++ )
{
hResult = GetVARIANTAt( lIdx, vValue, vItem );
strText = FromVariantToString( vItem );
if( lIdx != 0 )
{
_tcscat( pszText, NDS_SEPARATOR_S );
}
_tcscat( pszText, (LPCTSTR)strText );
VariantClear( &vItem );
}
break;
}
RELEASE( pOctetList );
VariantClear( &vValue );
return hResult;
}
/***********************************************************
Function: COleDsNDSPostalAddress::COleDsNDSPostalAddress
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSPostalAddress::COleDsNDSPostalAddress ( )
{
m_dwSyntaxID = ADSTYPE_POSTALADDRESS;
}
/***********************************************************
Function: COleDsNDSPostalAddress::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPostalAddress::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
ASSERT( ADSTYPE_POSTALADDRESS == pValue->dwType );
if( ADSTYPE_POSTALADDRESS != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_POSTALADDRESS != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
rString = _T("");
for( nIdx = 0 ; nIdx < 6 ; nIdx++ )
{
LPWSTR lpszPostalAddress;
lpszPostalAddress = pValue->pPostalAddress->PostalAddress[ nIdx ];
if( NULL != lpszPostalAddress )
{
TCHAR* pszTemp;
if( 0 != nIdx )
{
rString = rString + NDS_SEPARATOR;
}
pszTemp = (TCHAR*) AllocADsMem( sizeof(TCHAR) * ( 1 + wcslen( lpszPostalAddress ) ) );
Convert( pszTemp, lpszPostalAddress );
rString = rString + pszTemp;
FreeADsMem( pszTemp );
}
else
{
ASSERT( 0 != nIdx );
break;
}
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSPostalAddress::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPostalAddress::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwIdx;
DWORD dwValues;
pValue->dwType = ADSTYPE_POSTALADDRESS;
pValue->pPostalAddress = (ADS_POSTALADDRESS*) AllocADsMem( sizeof(ADS_POSTALADDRESS) );
for( dwIdx = 0; dwIdx < 6 ; dwIdx++ )
{
pValue->pPostalAddress->PostalAddress[ dwIdx ] = NULL;
}
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 0 == dwValues )
return S_OK;
for( dwIdx = 0; dwIdx < dwValues && dwIdx < 6; dwIdx++ )
{
CString strItem;
LPWSTR lpszPostalAddress;
strItem = GetValueByIndex( rString, NDS_SEPARATOR, dwIdx );
lpszPostalAddress = (LPWSTR) AllocADsMem( sizeof(TCHAR) * (strItem.GetLength( ) + 1 ) );
Convert( lpszPostalAddress, strItem.GetBuffer( strItem.GetLength( ) ) );
pValue->pPostalAddress->PostalAddress[ dwIdx ] = lpszPostalAddress;
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSPostalAddress::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSPostalAddress::FreeAttrValue( ADSVALUE* pValue )
{
DWORD dwIdx;
for( dwIdx = 0; dwIdx < 6 ; dwIdx++ )
{
FREE_MEMORY( pValue->pPostalAddress->PostalAddress[ dwIdx ] );
}
FreeADsMem( pValue->pPostalAddress );
}
/***********************************************************
Function: COleDsNDSPostalAddress::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPostalAddress::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
CString strData;
CString strItem;
DWORD dwIdx;
DWORD dwValues;
HRESULT hResult;
VARIANT vArray;
SAFEARRAY* pSArray;
SAFEARRAYBOUND saBound;
LONG lIdx;
IADsPostalAddress* pPostalAddress;
IDispatch* pDisp;
hResult = CoCreateInstance(
CLSID_PostalAddress,
NULL,
CLSCTX_ALL,
IID_IADsPostalAddress,
(void **)&pPostalAddress );
if( FAILED( hResult ) )
return hResult;
strData = pszText;
dwValues = GetValuesCount( strData, NDS_SEPARATOR );
saBound.lLbound = LBOUND;
saBound.cElements = dwValues;
pSArray = SafeArrayCreate( VT_VARIANT, 1, &saBound );
if( NULL == pSArray )
{
ASSERT( FALSE );
pPostalAddress->Release( );
return E_FAIL;
}
for( dwIdx = 0; dwIdx < dwValues ; dwIdx++ )
{
VARIANT vTemp;
VariantInit( &vTemp );
strItem = GetValueByIndex( strData, NDS_SEPARATOR, dwIdx );
V_VT( &vTemp ) = VT_BSTR;
V_BSTR( &vTemp ) = AllocBSTR( strItem.GetBuffer( strItem.GetLength( ) ) );
lIdx = (long)dwIdx + LBOUND;
hResult = SafeArrayPutElement( pSArray, &lIdx, &vTemp );
VariantClear( &vTemp );
ASSERT( SUCCEEDED( hResult ) );
}
VariantInit( &vArray );
V_VT( &vArray ) = VT_ARRAY | VT_VARIANT;
V_ARRAY( &vArray ) = pSArray;
hResult = pPostalAddress->put_PostalAddress( vArray );
ASSERT( SUCCEEDED( hResult ) );
VariantClear( &vArray );
hResult = pPostalAddress->QueryInterface( IID_IDispatch, (void**)&pDisp );
VariantInit( &rVar );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
RELEASE( pPostalAddress );
return hResult;
}
/***********************************************************
Function: COleDsNDSPostalAddress::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPostalAddress::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsPostalAddress* pPostalAddress = NULL;
VARIANT varData;
CString strText;
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsPostalAddress,
(void**)&pPostalAddress );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pPostalAddress->get_PostalAddress( &varData );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
strText = FromVariantArrayToString( varData, NDS_SEPARATOR_S );
_tcscpy( pszText, (LPCTSTR)strText );
VariantClear( &varData );
break;
}
RELEASE( pPostalAddress )
return hResult;
}
/***********************************************************
Function: COleDsNDSFaxNumber::COleDsNDSFaxNumber
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSFaxNumber::COleDsNDSFaxNumber ( )
{
m_dwSyntaxID = ADSTYPE_FAXNUMBER;
}
/***********************************************************
Function: COleDsNDSFaxNumber::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSFaxNumber::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
TCHAR szText[ 256 ];
ASSERT( ADSTYPE_FAXNUMBER == pValue->dwType );
if( ADSTYPE_FAXNUMBER != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_FAXNUMBER != pValue->dwType");
return E_FAIL;
}
if( NULL == pValue->pFaxNumber )
{
ASSERT( FALSE );
rString = _T("ERROR: pValue->pFaxNumber Is NULL");
return E_FAIL;
}
nIdx = 0;
if( NULL != pValue->pFaxNumber->TelephoneNumber )
{
_stprintf( szText,
_T("%S"),
pValue->pFaxNumber->TelephoneNumber );
}
else
{
_tcscpy( szText, _T("NULL") );
}
_tcscat( szText, NDS_SEPARATOR_S );
rString = szText;
if( NULL != pValue->pFaxNumber->Parameters )
{
rString = rString + Blob2String( pValue->pFaxNumber->Parameters,
pValue->pFaxNumber->NumberOfBits );
}
else
{
rString = rString + _T("NULL");
}
return S_OK;
}
/***********************************************************
Function: COleDsNDSFaxNumber::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSFaxNumber::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues;
CString strTelephoneNumber;
CString strParameters;
pValue->dwType = ADSTYPE_FAXNUMBER;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strTelephoneNumber = GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strParameters = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
pValue->pFaxNumber = (ADS_FAXNUMBER*) AllocADsMem( sizeof(ADS_FAXNUMBER) );
ASSERT( NULL != pValue->pFaxNumber );
if( NULL == pValue->pFaxNumber )
{
return E_FAIL;
}
pValue->pFaxNumber->TelephoneNumber = AllocWCHAR( (LPTSTR)(LPCTSTR)strTelephoneNumber );
String2Blob( strParameters.GetBuffer( strParameters.GetLength( ) ),
(void**) (pValue->pFaxNumber->Parameters),
&(pValue->pFaxNumber->NumberOfBits) );
return S_OK;
}
/***********************************************************
Function: COleDsNDSFaxNumber::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSFaxNumber::FreeAttrValue( ADSVALUE* pValue )
{
if( NULL != pValue->pFaxNumber )
{
FREE_MEMORY( pValue->pFaxNumber->TelephoneNumber );
FREE_MEMORY( pValue->pFaxNumber->Parameters );
}
FREE_MEMORY( pValue->pFaxNumber );
}
/***********************************************************
Function: COleDsNDSFaxNumber::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSFaxNumber::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
DWORD dwValues;
CString strTelephoneNumber, strVal;
CString strParameters;
HRESULT hResult;
IADsFaxNumber* pFaxNumber = NULL;
IDispatch* pDisp = NULL;
BSTR bstrVal = NULL;
VARIANT vVal;
VariantInit( &vVal );
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_FaxNumber,
NULL,
CLSCTX_ALL,
IID_IADsFaxNumber,
(void **)&pFaxNumber);
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strVal = pszText;
dwValues = GetValuesCount( strVal, NDS_SEPARATOR );
if( 2 != dwValues )
{
hResult = E_FAIL;
ASSERT( FALSE );
break;
}
strTelephoneNumber= GetValueByIndex( strVal, NDS_SEPARATOR, 0L );
strParameters = GetValueByIndex( strVal, NDS_SEPARATOR, 1L );
bstrVal = AllocBSTR( strTelephoneNumber.GetBuffer( strTelephoneNumber.GetLength( ) ) );
hResult = pFaxNumber->put_TelephoneNumber( bstrVal );
ASSERT( SUCCEEDED( hResult ) );
hResult = CreateBlobArray( strParameters, vVal );
ASSERT( SUCCEEDED( hResult ) );
hResult = pFaxNumber->put_Parameters( vVal );
ASSERT( SUCCEEDED( hResult ) );
hResult = pFaxNumber->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
break;
}
SysFreeString( bstrVal );
VariantClear( &vVal );
RELEASE( pFaxNumber );
return hResult;
}
/***********************************************************
Function: COleDsNDSFaxNumber::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSFaxNumber::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsFaxNumber* pFaxNumber = NULL;
VARIANT vParameters;
BSTR bstrTelephoneNumber = NULL;
CString strText;
VariantInit( &vParameters );
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsFaxNumber,
(void**)&pFaxNumber );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pFaxNumber->get_TelephoneNumber( &bstrTelephoneNumber );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pFaxNumber->get_Parameters( &vParameters );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
Convert( pszText, bstrTelephoneNumber );
_tcscat( pszText, NDS_SEPARATOR_S );
strText = FromVariantToString( vParameters );
_tcscat( pszText, (LPCTSTR)strText );
break;
}
SysFreeString( bstrTelephoneNumber );
VariantClear( &vParameters );
RELEASE( pFaxNumber );
return hResult;
}
/***********************************************************
Function: COleDsNDSEMail::COleDsNDSEMail
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSEMail::COleDsNDSEMail ( )
{
m_dwSyntaxID = ADSTYPE_EMAIL;
}
/***********************************************************
Function: COleDsNDSEMail::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSEMail::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
TCHAR szText[ 256 ];
ASSERT( ADSTYPE_EMAIL == pValue->dwType );
if( ADSTYPE_EMAIL != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_EMAIL != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
if( NULL != pValue->Email.Address )
{
_stprintf( szText,
_T("%ld & %S"),
pValue->Email.Type,
pValue->Email.Address );
}
else
{
_stprintf( szText,
_T("%ld & NULL"),
pValue->Email.Type );
}
rString = szText;
return S_OK;
}
/***********************************************************
Function: COleDsNDSEMail::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSEMail::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues, dwSize;
CString strNumber;
CString strAddress;
pValue->dwType = ADSTYPE_EMAIL;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strNumber = GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strAddress = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
pValue->Email.Type = (DWORD)_ttol( (LPCTSTR) strNumber );
dwSize = strAddress.GetLength( ) + 1;
dwSize = dwSize * sizeof(WCHAR);
pValue->Email.Address = (LPWSTR) AllocADsMem( dwSize );
Convert( pValue->Email.Address, strAddress.GetBuffer( strAddress.GetLength( ) ) );
return S_OK;
}
/***********************************************************
Function: COleDsNDSEMail::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSEMail::FreeAttrValue( ADSVALUE* pValue )
{
FREE_MEMORY( pValue->Email.Address );
}
/***********************************************************
Function: COleDsNDSEMail::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSEMail::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
DWORD dwValues;
CString strNumber, strVal;
CString strAddress;
HRESULT hResult;
IADsEmail* pEMail = NULL;
IDispatch* pDisp = NULL;
BSTR bstrVal = NULL;
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_Email,
NULL,
CLSCTX_ALL,
IID_IADsEmail,
(void **)&pEMail);
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strVal = pszText;
dwValues = GetValuesCount( strVal, NDS_SEPARATOR );
if( 2 != dwValues )
{
hResult = E_FAIL;
ASSERT( FALSE );
break;
}
strNumber = GetValueByIndex( strVal, NDS_SEPARATOR, 0L );
strAddress = GetValueByIndex( strVal, NDS_SEPARATOR, 1L );
hResult = pEMail->put_Type( _ttol( (LPCTSTR) strNumber ) );
ASSERT( SUCCEEDED( hResult ) );
bstrVal = AllocBSTR( strAddress.GetBuffer( strAddress.GetLength( ) ) );
hResult = pEMail->put_Address( bstrVal );
ASSERT( SUCCEEDED( hResult ) );
hResult = pEMail->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
break;
}
SysFreeString( bstrVal );
RELEASE( pEMail );
return hResult;
}
/***********************************************************
Function: COleDsNDSEMail::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSEMail::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsEmail* pEmail = NULL;
LONG lType;
BSTR bstrVal = NULL;
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsEmail,
(void**)&pEmail );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pEmail->get_Type( &lType );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pEmail->get_Address( &bstrVal );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
_ltot( lType, pszText, 10 );
_tcscat( pszText, NDS_SEPARATOR_S );
Convert( pszText + _tcslen(pszText), bstrVal );
break;
}
SysFreeString( bstrVal );
RELEASE( pEmail );
return hResult;
}
/***********************************************************
Function: COleDsNDSTypedName::COleDsNDSTypedName
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSTypedName::COleDsNDSTypedName( )
{
m_dwSyntaxID = ADSTYPE_TYPEDNAME;
}
/***********************************************************
Function: COleDsNDSTypedName::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTypedName::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
TCHAR szText[ 256 ];
ASSERT( ADSTYPE_TYPEDNAME == pValue->dwType );
if( ADSTYPE_TYPEDNAME != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_TYPEDNAME != pValue->dwType");
return E_FAIL;
}
if( NULL == pValue->pTypedName )
{
ASSERT( FALSE );
return E_FAIL;
}
nIdx = 0;
if( NULL != pValue->pTypedName->ObjectName )
{
_stprintf( szText,
_T("%S & %ld & %ld"),
pValue->pTypedName->ObjectName,
pValue->pTypedName->Level,
pValue->pTypedName->Interval );
}
else
{
_stprintf( szText,
_T("NULL & %ld & %ld"),
pValue->pTypedName->Level,
pValue->pTypedName->Interval );
}
rString = szText;
return S_OK;
}
/***********************************************************
Function: COleDsNDSTypedName::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTypedName::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues;
CString strLevel;
CString strInterval;
CString strObjectName;
pValue->dwType = ADSTYPE_TYPEDNAME;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 3 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
pValue->pTypedName = (ADS_TYPEDNAME*) AllocADsMem( sizeof(ADS_TYPEDNAME) );
strObjectName = GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strLevel = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
strInterval = GetValueByIndex( rString, NDS_SEPARATOR, 2L );
pValue->pTypedName->Level = (DWORD)_ttol( (LPCTSTR) strLevel );
pValue->pTypedName->Interval = (DWORD)_ttol( (LPCTSTR) strInterval );
pValue->pTypedName->ObjectName= AllocWCHAR( (TCHAR*)(LPCTSTR)strObjectName );
return S_OK;
}
/***********************************************************
Function: COleDsNDSTypedName::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSTypedName::FreeAttrValue( ADSVALUE* pValue )
{
FREE_MEMORY( pValue->pTypedName->ObjectName );
FREE_MEMORY( pValue->pTypedName );
}
/***********************************************************
Function: COleDsNDSEMail::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTypedName::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
DWORD dwValues;
CString strLevel, strVal;
CString strInterval;
CString strObjectName;
HRESULT hResult;
IADsTypedName* pTypedName = NULL;
IDispatch* pDisp = NULL;
BSTR bstrObjectName = NULL;
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_TypedName,
NULL,
CLSCTX_ALL,
IID_IADsTypedName,
(void **)&pTypedName );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strVal = pszText;
dwValues = GetValuesCount( strVal, NDS_SEPARATOR );
if( 3 != dwValues )
{
hResult = E_FAIL;
ASSERT( FALSE );
break;
}
strObjectName = GetValueByIndex( strVal, NDS_SEPARATOR, 0L );
strLevel = GetValueByIndex( strVal, NDS_SEPARATOR, 1L );
strInterval = GetValueByIndex( strVal, NDS_SEPARATOR, 2L );
hResult = pTypedName->put_Level( _ttol( (LPCTSTR) strLevel ) );
ASSERT( SUCCEEDED( hResult ) );
hResult = pTypedName->put_Interval( _ttol( (LPCTSTR) strInterval ) );
ASSERT( SUCCEEDED( hResult ) );
bstrObjectName = AllocBSTR( strObjectName.GetBuffer( strObjectName.GetLength( ) ) );
hResult = pTypedName->put_ObjectName( bstrObjectName );
ASSERT( SUCCEEDED( hResult ) );
hResult = pTypedName->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
break;
}
SysFreeString( bstrObjectName );
RELEASE( pTypedName );
return hResult;
}
/***********************************************************
Function: COleDsNDSTypedName::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTypedName::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsTypedName* pTypedName = NULL;
LONG lLevel, lInterval;
BSTR bstrObjectName = NULL;
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsTypedName,
(void**)&pTypedName );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pTypedName->get_Level( &lLevel );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pTypedName->get_Interval( &lInterval );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pTypedName->get_ObjectName( &bstrObjectName );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
Convert( pszText, bstrObjectName );
_tcscat( pszText, NDS_SEPARATOR_S );
_ltot( lLevel, pszText + _tcslen( pszText), 10 );
_tcscat( pszText, NDS_SEPARATOR_S );
_ltot( lInterval, pszText + _tcslen( pszText), 10 );
break;
}
SysFreeString( bstrObjectName );
RELEASE( pTypedName );
return hResult;
}
/***********************************************************
Function: COleDsNDSHold::COleDsNDSHold
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSHold::COleDsNDSHold( )
{
m_dwSyntaxID = ADSTYPE_HOLD;
}
/***********************************************************
Function: COleDsNDSHold::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSHold::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
TCHAR szText[ 256 ];
ASSERT( ADSTYPE_HOLD == pValue->dwType );
if( ADSTYPE_HOLD != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_HOLD != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
if( NULL != pValue->Hold.ObjectName )
{
_stprintf( szText,
_T("%ld & %S"),
pValue->Hold.Amount,
pValue->Hold.ObjectName );
}
else
{
_stprintf( szText,
_T("NULL & %ld "),
pValue->Hold.Amount );
}
rString = szText;
return S_OK;
}
/***********************************************************
Function: COleDsNDSHold::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSHold::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues;
CString strAmount;
CString strObjectName;
pValue->dwType = ADSTYPE_HOLD;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strAmount = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
strObjectName = GetValueByIndex( rString, NDS_SEPARATOR, 0L );
pValue->Hold.Amount = (DWORD)_ttol( (LPCTSTR) strAmount );
pValue->Hold.ObjectName = AllocWCHAR( (TCHAR*)(LPCTSTR)strObjectName );
return S_OK;
}
/***********************************************************
Function: COleDsNDSHold::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSHold::FreeAttrValue( ADSVALUE* pValue )
{
FREE_MEMORY( pValue->Hold.ObjectName );
}
/***********************************************************
Function: COleDsNDSEMail::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSHold::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
DWORD dwValues;
CString strAmount, strVal;
CString strObjectName;
HRESULT hResult;
IADsHold* pHold = NULL;
IDispatch* pDisp = NULL;
BSTR bstrObjectName = NULL;
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_Hold,
NULL,
CLSCTX_ALL,
IID_IADsHold,
(void **)&pHold );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strVal = pszText;
dwValues = GetValuesCount( strVal, NDS_SEPARATOR );
if( 2 != dwValues )
{
hResult = E_FAIL;
ASSERT( FALSE );
break;
}
strAmount = GetValueByIndex( strVal, NDS_SEPARATOR, 1L );
strObjectName = GetValueByIndex( strVal, NDS_SEPARATOR, 0L );
hResult = pHold->put_Amount( _ttol( (LPCTSTR) strAmount ) );
ASSERT( SUCCEEDED( hResult ) );
bstrObjectName = AllocBSTR( strObjectName.GetBuffer( strObjectName.GetLength( ) ) );
hResult = pHold->put_ObjectName( bstrObjectName );
ASSERT( SUCCEEDED( hResult ) );
hResult = pHold->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
break;
}
SysFreeString( bstrObjectName );
RELEASE( pHold );
return hResult;
}
/***********************************************************
Function: COleDsNDSHold::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSHold::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsHold* pHold = NULL;
LONG lAmount;
BSTR bstrObjectName = NULL;
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsHold,
(void**)&pHold );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pHold->get_Amount( &lAmount );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pHold->get_ObjectName( &bstrObjectName );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
Convert( pszText, bstrObjectName );
_tcscat( pszText, NDS_SEPARATOR_S );
_ltot( lAmount, pszText + _tcslen( pszText), 10 );
break;
}
SysFreeString( bstrObjectName );
RELEASE( pHold );
return hResult;
}
/***********************************************************
Function: COleDsNDSBackLink::COleDsNDSBackLink
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSBackLink::COleDsNDSBackLink( )
{
m_dwSyntaxID = ADSTYPE_BACKLINK;
}
/***********************************************************
Function: COleDsNDSBackLink::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSBackLink::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
TCHAR szText[ 256 ];
ASSERT( ADSTYPE_BACKLINK == pValue->dwType );
if( ADSTYPE_BACKLINK != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_BACKLINK != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
if( NULL != pValue->BackLink.ObjectName )
{
_stprintf( szText,
_T("%ld & %S"),
pValue->BackLink.RemoteID,
pValue->BackLink.ObjectName );
}
else
{
_stprintf( szText,
_T("%ld & NULL"),
pValue->BackLink.RemoteID );
}
rString = szText;
return S_OK;
}
/***********************************************************
Function: COleDsNDSBackLink::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSBackLink::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues;
CString strRemoteID;
CString strObjectName;
pValue->dwType = ADSTYPE_BACKLINK;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strRemoteID = GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strObjectName = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
pValue->BackLink.RemoteID = (DWORD)_ttol( (LPCTSTR) strRemoteID );
pValue->BackLink.ObjectName = AllocWCHAR( (TCHAR*)(LPCTSTR)strObjectName );
return S_OK;
}
/***********************************************************
Function: COleDsNDSBackLink::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSBackLink::FreeAttrValue( ADSVALUE* pValue )
{
FREE_MEMORY( pValue->BackLink.ObjectName );
}
/***********************************************************
Function: COleDsNDSEMail::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSBackLink::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
DWORD dwValues;
CString strRemoteID, strVal;
CString strObjectName;
HRESULT hResult;
IADsBackLink* pBackLink = NULL;
IDispatch* pDisp = NULL;
BSTR bstrObjectName = NULL;
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_BackLink,
NULL,
CLSCTX_ALL,
IID_IADsBackLink,
(void **)&pBackLink );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strVal = pszText;
dwValues = GetValuesCount( strVal, NDS_SEPARATOR );
if( 2 != dwValues )
{
hResult = E_FAIL;
ASSERT( FALSE );
break;
}
strRemoteID = GetValueByIndex( strVal, NDS_SEPARATOR, 0L );
strObjectName = GetValueByIndex( strVal, NDS_SEPARATOR, 1L );
hResult = pBackLink->put_RemoteID( _ttol( (LPCTSTR) strRemoteID ) );
ASSERT( SUCCEEDED( hResult ) );
bstrObjectName = AllocBSTR( strObjectName.GetBuffer( strObjectName.GetLength( ) ) );
hResult = pBackLink->put_ObjectName( bstrObjectName );
ASSERT( SUCCEEDED( hResult ) );
hResult = pBackLink->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
break;
}
SysFreeString( bstrObjectName );
RELEASE( pBackLink );
return hResult;
}
/***********************************************************
Function: COleDsNDSBackLink::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSBackLink::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsBackLink* pBackLink = NULL;
LONG lRemoteID;
BSTR bstrObjectName = NULL;
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsBackLink,
(void**)&pBackLink );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pBackLink->get_RemoteID( &lRemoteID );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pBackLink->get_ObjectName( &bstrObjectName );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
_ltot( lRemoteID, pszText, 10 );
_tcscat( pszText, NDS_SEPARATOR_S );
Convert( pszText + _tcslen(pszText), bstrObjectName );
break;
}
SysFreeString( bstrObjectName );
RELEASE( pBackLink );
return hResult;
}
/***********************************************************
Function: COleDsNDSPostalAddress::COleDsNDSPostalAddress
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSPath::COleDsNDSPath ( )
{
m_dwSyntaxID = ADSTYPE_PATH;
}
/***********************************************************
Function: COleDsNDSPath::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPath::Native2Value( ADSVALUE* pValue,
CString& rString )
{
int nIdx;
TCHAR szText[ 256 ];
ASSERT( ADSTYPE_PATH == pValue->dwType );
if( ADSTYPE_PATH != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_PATH != pValue->dwType");
return E_FAIL;
}
nIdx = 0;
if( NULL != pValue->pPath )
{
_stprintf( szText,
_T("%ld & %S & %S"),
pValue->pPath->Type,
pValue->pPath->VolumeName,
pValue->pPath->Path);
}
else
{
_stprintf( szText,
_T("%ld & NULL & NULL"),
pValue->pPath->Type );
}
rString = szText;
return S_OK;
}
/***********************************************************
Function: COleDsNDSPath::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPath::Value2Native( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues;
CString strType;
CString strVolName;
CString strPath;
pValue->pPath = (ADS_PATH*) AllocADsMem( sizeof(ADS_PATH) );
if( NULL == pValue->pPath )
return E_FAIL;
pValue->pPath->VolumeName = NULL;
pValue->pPath->Path = NULL;
pValue->dwType = ADSTYPE_PATH;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 3 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strType = GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strVolName = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
strPath = GetValueByIndex( rString, NDS_SEPARATOR, 2L );
pValue->pPath->Type = (DWORD)_ttol( (LPCTSTR) strType );
pValue->pPath->VolumeName = AllocWCHAR( strVolName.GetBuffer( strVolName.GetLength( ) ) );
pValue->pPath->Path = AllocWCHAR( strPath.GetBuffer( strPath.GetLength( ) ) );
return S_OK;
}
/***********************************************************
Function: COleDsNDSEMail::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsNDSPath::FreeAttrValue( ADSVALUE* pValue )
{
FREE_MEMORY( pValue->pPath->VolumeName );
FREE_MEMORY( pValue->pPath->Path );
FREE_MEMORY( pValue->pPath );
}
/***********************************************************
Function: COleDsNDSPath::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPath::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
DWORD dwValues;
CString strType, strVal;
CString strVolName;
CString strPath;
HRESULT hResult;
IADsPath* pPath = NULL;
IDispatch* pDisp = NULL;
BSTR bstrVal = NULL;
while( TRUE )
{
hResult = CoCreateInstance(
CLSID_Path,
NULL,
CLSCTX_ALL,
IID_IADsPath,
(void **)&pPath );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
break;
strVal = pszText;
dwValues = GetValuesCount( strVal, NDS_SEPARATOR );
if( 3 != dwValues )
{
hResult = E_FAIL;
ASSERT( FALSE );
break;
}
strType = GetValueByIndex( strVal, NDS_SEPARATOR, 0L );
strVolName = GetValueByIndex( strVal, NDS_SEPARATOR, 1L );
strPath = GetValueByIndex( strVal, NDS_SEPARATOR, 2L );
hResult = pPath->put_Type( _ttol( (LPCTSTR) strType ) );
ASSERT( SUCCEEDED( hResult ) );
bstrVal = AllocBSTR( strVolName.GetBuffer( strVolName.GetLength( ) ) );
hResult = pPath->put_VolumeName( bstrVal );
ASSERT( SUCCEEDED( hResult ) );
SysFreeString( bstrVal );
bstrVal = AllocBSTR( strPath.GetBuffer( strPath.GetLength( ) ) );
hResult = pPath->put_Path( bstrVal );
ASSERT( SUCCEEDED( hResult ) );
SysFreeString( bstrVal );
hResult = pPath->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_VT( &rVar ) = VT_DISPATCH;
V_DISPATCH( &rVar ) = pDisp;
break;
}
RELEASE( pPath );
return hResult;
}
/***********************************************************
Function: COleDsNDSPath::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSPath::VARIANT_2_String( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult = E_FAIL;
IADsPath* pPath = NULL;
LONG lType;
BSTR bstrVolName = NULL;
BSTR bstrPath = NULL;
while( TRUE )
{
ASSERT( VT_DISPATCH == V_VT( &rVar ) );
if( VT_DISPATCH != V_VT( &rVar ) )
break;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsPath,
(void**)&pPath );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pPath->get_Type( &lType );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pPath->get_VolumeName( &bstrVolName );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
hResult = pPath->get_Path( &bstrPath );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult) )
break;
_ltot( lType, pszText, 10 );
_tcscat( pszText, NDS_SEPARATOR_S );
Convert( pszText + _tcslen(pszText), bstrVolName );
_tcscat( pszText, NDS_SEPARATOR_S );
Convert( pszText + _tcslen(pszText), bstrPath );
break;
}
SysFreeString( bstrVolName );
SysFreeString( bstrPath );
RELEASE( pPath );
return hResult;
}
/***********************************************************
Function: COleDsNDSTimeStamp::COleDsNDSTimeStamp
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSTimeStamp::COleDsNDSTimeStamp( )
{
m_dwSyntaxID = ADSTYPE_TIMESTAMP;
}
/***********************************************************
Function: COleDsNDSTimeStamp::GenerateString
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTimeStamp::GenerateString( TCHAR* szText,
DWORD dwWholeSeconds,
DWORD dwEventID )
{
_tcscpy( szText, _T("WholeSeconds: ") );
_ultot( dwWholeSeconds,
szText + _tcslen(szText),
10 );
_tcscat( szText, _T("EventID: ") );
_ultot( dwEventID,
szText + _tcslen(szText),
10 );
return S_OK;
}
/***********************************************************
Function: COleDsNDSTimeStamp::GetComponents
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTimeStamp::GetComponents( TCHAR* pszString,
DWORD* pdwWholeSeconds,
DWORD* pdwEventID )
{
TCHAR szText1[ 128 ];
TCHAR szText2[ 128 ];
*pdwWholeSeconds = 0xAABBCCDD;
*pdwEventID = 0xAABBCCDD;
_stscanf( pszString, _T("%s%d%s%d"), szText1,
pdwWholeSeconds, szText2, pdwWholeSeconds );
return ( (*pdwWholeSeconds == 0xAABBCCDD) && (*pdwEventID == 0xAABBCCDD) ) ?
S_OK : E_FAIL;
}
/***********************************************************
Function: COleDsNDSTimeStamp::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTimeStamp::Value2Native ( ADSVALUE* pValue,
CString& rString )
{
DWORD dwValues;
CString strWholeSeconds;
CString strEventID;
pValue->dwType = ADSTYPE_TIMESTAMP;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strWholeSeconds= GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strEventID = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
pValue->Timestamp.WholeSeconds= (DWORD)_ttol( (LPCTSTR) strWholeSeconds );
pValue->Timestamp.EventID = (DWORD)_ttol( (LPCTSTR) strEventID );
return S_OK;
}
/***********************************************************
Function: COleDsNDSTimeStamp::Native2Value
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTimeStamp::Native2Value( ADSVALUE* pValue,
CString& rString)
{
TCHAR szText[ 128 ];
ASSERT( ADSTYPE_TIMESTAMP != pValue->dwType );
if( ADSTYPE_TIMESTAMP != pValue->dwType )
{
rString = _T("ERROR: ADSTYPE_TIMESTAMP != pValue->dwType");
return E_FAIL;
}
_ultot( pValue->Timestamp.WholeSeconds,
szText,
10 );
_tcscat( szText, NDS_SEPARATOR_S );
_ultot( pValue->Timestamp.EventID,
szText + _tcslen(szText),
10 );
rString = szText;
return S_OK;
}
/***********************************************************
Function: COleDsNDSTimeStamp::String_2_VARIANT
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTimeStamp::String_2_VARIANT( TCHAR* pszText,
VARIANT& rVar )
{
HRESULT hResult;
IADsTimestamp* pTimeStamp;
DWORD dwValues;
CString strWholeSeconds;
CString strEventID;
CString rString;
rString = pszText;
dwValues = GetValuesCount( rString, NDS_SEPARATOR );
if( 2 != dwValues )
{
ASSERT( FALSE );
return E_FAIL;
}
strWholeSeconds= GetValueByIndex( rString, NDS_SEPARATOR, 0L );
strEventID = GetValueByIndex( rString, NDS_SEPARATOR, 1L );
hResult = hResult = CoCreateInstance(
CLSID_Timestamp,
NULL,
CLSCTX_INPROC_SERVER,
IID_IADsTimestamp,
(void **)&pTimeStamp );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
return hResult;
hResult = pTimeStamp->put_WholeSeconds( _ttol( (LPCTSTR) strWholeSeconds ) );
ASSERT( SUCCEEDED( hResult ) );
hResult = pTimeStamp->put_EventID( _ttol( (LPCTSTR) strEventID ) );
ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) )
{
IDispatch* pDisp = NULL;
V_VT( &rVar ) = VT_DISPATCH;
hResult = pTimeStamp->QueryInterface( IID_IDispatch, (void**)&pDisp );
ASSERT( SUCCEEDED( hResult ) );
V_DISPATCH( &rVar ) = pDisp;
}
pTimeStamp->Release( );
return hResult;
}
/***********************************************************
Function: COleDsNDSTimeStamp::VARIANT_2_String
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsNDSTimeStamp::VARIANT_2_String( TCHAR* pszText, VARIANT& rVar )
{
IADsTimestamp* pTimeStamp = NULL;
HRESULT hResult;
long lWholeSeconds, lEventID;
ASSERT( VT_DISPATCH == V_VT( &rVar) );
if( VT_DISPATCH != V_VT( &rVar) )
{
_tcscpy( pszText, _T("ERROR: VT_DISPATCH != V_VT( &rVar)") );
return E_FAIL;
}
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsTimestamp,
(void**)&pTimeStamp );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) )
{
_tcscpy( pszText, _T("ERROR: QI for IID_IADsTimeStamp fails") );
return hResult;
}
hResult = pTimeStamp->get_WholeSeconds( &lWholeSeconds );
ASSERT( SUCCEEDED( hResult ) );
hResult = pTimeStamp->get_EventID( &lEventID );
ASSERT( SUCCEEDED( hResult ) );
pTimeStamp->Release( );
_ultot( lWholeSeconds,
pszText,
10 );
_tcscat( pszText, NDS_SEPARATOR_S );
_ultot( lEventID,
pszText + _tcslen(pszText),
10 );
return hResult;
}
/***********************************************************
Function: COleDsNDSComplexType::COleDsNDSComplexType
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsNDSComplexType::COleDsNDSComplexType( )
{
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsNDSComplexType::VarToDisplayStringEx( VARIANT& var,
BOOL bMultiValued )
{
SAFEARRAY* pSArray;
HRESULT hResult;
LONG uLow, uHigh, uIndex;
VARIANT vItem;
CString strVal;
CString strTemp;
pSArray = V_ARRAY( &var );
hResult = SafeArrayGetLBound( pSArray, 1, &uLow );
hResult = SafeArrayGetUBound( pSArray, 1, &uHigh );
if( !bMultiValued )
{
ASSERT( uLow == uHigh );
}
for( uIndex = uLow; uIndex <= uHigh; uIndex++ )
{
if( uIndex != uLow )
{
strVal += SEPARATOR_S;
}
VariantInit( &vItem );
hResult = SafeArrayGetElement( pSArray, &uIndex, &vItem );
ASSERT( SUCCEEDED( hResult ) );
strTemp = VarToDisplayString( vItem, bMultiValued, FALSE );
VariantClear( &vItem );
strVal += strTemp;
if( strVal.GetLength( ) > 8096 )
break;
}
return strVal;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsNDSComplexType::VarToDisplayString( VARIANT& var,
BOOL bMultiValued,
BOOL bUseEx )
{
LONG uLow, uHigh, uIndex;
SAFEARRAY* psa;
VARIANT vItem;
CString strVal, strTemp;
HRESULT hResult;
TCHAR szText[ 2048 ];
if( bUseEx )
{
return VarToDisplayStringEx( var, bMultiValued );
}
if( bMultiValued )
{
if( VT_DISPATCH == V_VT( &var ) )
{
VARIANT_2_String( szText, var );
return CString( szText );
}
ASSERT( (VT_ARRAY | VT_VARIANT) == V_VT(&var) );
if( (VT_ARRAY | VT_VARIANT) == V_VT(&var) )
{
return CString( _T("ERROR: (VT_ARRAY | VT_VARIANT) != V_VT(&var)") );
}
psa = V_ARRAY( &var );
ASSERT( NULL != psa );
if( NULL == psa )
{
return CString( _T("ERROR: NULL == psa" ) );
}
hResult = SafeArrayGetLBound( psa, 1, &uLow );
hResult = SafeArrayGetUBound( psa, 1, &uHigh );
for( uIndex = uLow; uIndex <= uHigh; uIndex++ )
{
if( uIndex != uLow )
{
strVal += SEPARATOR_S;
}
VariantInit( &vItem );
hResult = SafeArrayGetElement( psa, &uIndex, &vItem );
ASSERT( SUCCEEDED( hResult ) );
strTemp = VarToDisplayString( vItem, FALSE, FALSE );
VariantClear( &vItem );
strVal += strTemp;
if( strVal.GetLength( ) > 8096 )
break;
}
}
else
{
hResult = VARIANT_2_String( szText, var );
if( SUCCEEDED( hResult ) )
{
strVal = szText;
}
else
{
strVal = OleDsGetErrorText( hResult );
}
}
return strVal;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsNDSComplexType::DisplayStringToDispParamsEx( CString& rText,
DISPPARAMS& dispParams,
BOOL bMultiValued )
{
SAFEARRAY* pSArray;
SAFEARRAYBOUND saBound;
HRESULT hResult;
LONG lIdx = LBOUND;
DisplayStringToDispParams( rText, dispParams, bMultiValued, FALSE );
if( !bMultiValued )
{
saBound.lLbound = LBOUND;
saBound.cElements = 1;
pSArray = SafeArrayCreate( VT_VARIANT, 1, &saBound );
hResult = SafeArrayPutElement( pSArray, &lIdx, &dispParams.rgvarg[0] );
VariantClear( &dispParams.rgvarg[0] );
V_VT( &dispParams.rgvarg[0] ) = VT_ARRAY | VT_VARIANT;
V_ARRAY( &dispParams.rgvarg[0] ) = pSArray;
}
return TRUE;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsNDSComplexType::DisplayStringToDispParams( CString& rText,
DISPPARAMS& dispParams,
BOOL bMultiValued,
BOOL bUseEx )
{
HRESULT hResult;
int x= 0;
if( bUseEx )
{
return DisplayStringToDispParamsEx( rText, dispParams, bMultiValued );
}
dispParams.rgdispidNamedArgs[ 0 ] = DISPID_PROPERTYPUT;
dispParams.cArgs = 1;
dispParams.cNamedArgs = 1;
if( bMultiValued )
{
SAFEARRAY* psa;
SAFEARRAYBOUND sab;
TCHAR* strText;
TCHAR* strStore;
int nItems = 0;
int nIdx;
int nSize;
HRESULT hResult;
//rText.MakeUpper( );
strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ];
strStore = strText;
if( !strText )
{
return E_FAIL;
}
_tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) );
nSize = rText.GetLength( );
nItems = 1;
for( nIdx = 0; nIdx < nSize ; nIdx++ )
{
if( strText[ nIdx ] == SEPARATOR_C )
{
strText[ nIdx ] = _T('\0');
nItems++;
}
}
sab.cElements = nItems;
sab.lLbound = LBOUND;
psa = SafeArrayCreate( VT_VARIANT, 1, &sab );
ASSERT( NULL != psa );
if ( psa )
{
for( nIdx = LBOUND; nIdx < ( LBOUND + nItems ) ; nIdx++ )
{
VARIANT var;
String_2_VARIANT( strText, var );
strText += _tcslen( strText ) + 1;
hResult = SafeArrayPutElement( psa, (long FAR *)&nIdx, &var );
VariantClear( &var );
}
V_VT( &dispParams.rgvarg[0] ) = VT_VARIANT | VT_ARRAY;
V_ARRAY( &dispParams.rgvarg[0] ) = psa;
}
delete [] strStore;
}
else
{
hResult = String_2_VARIANT( rText.GetBuffer( rText.GetLength( ) ),
dispParams.rgvarg[0] );
}
return SUCCEEDED( hResult );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsVARIANT::VarToDisplayString( VARIANT& var, BOOL bMultiValued, BOOL bUseEx )
{
return FromVariantArrayToString( var );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsVARIANT::Native2Value( ADSVALUE* pADsObject, CString& rVal )
{
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsVARIANT::Value2Native( ADSVALUE* pADsObject, CString& rVal )
{
return S_OK;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsVARIANT::DisplayStringToDispParams( CString& rText, DISPPARAMS& dispParams, BOOL bMultiValued, BOOL bUseEx )
{
HRESULT hResult;
dispParams.rgdispidNamedArgs[ 0 ] = DISPID_PROPERTYPUT;
dispParams.cArgs = 1;
dispParams.cNamedArgs = 1;
hResult = BuildVariantArray( VT_BSTR, rText, dispParams.rgvarg[0] );
return SUCCEEDED( hResult );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
COleDsOctetString::COleDsOctetString( )
{
m_dwSyntaxID = ADSTYPE_OCTET_STRING;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsOctetString::VarToDisplayStringEx( VARIANT& var, BOOL bMultiValued )
{
SAFEARRAY* pSArray;
HRESULT hResult;
LONG uLow, uHigh, uIndex;
VARIANT vItem;
CString strVal;
CString strTemp;
pSArray = V_ARRAY( &var );
hResult = SafeArrayGetLBound( pSArray, 1, &uLow );
hResult = SafeArrayGetUBound( pSArray, 1, &uHigh );
if( !bMultiValued )
{
ASSERT( uLow == uHigh );
}
for( uIndex = uLow; uIndex <= uHigh; uIndex++ )
{
if( uIndex != uLow )
{
strVal += SEPARATOR_S;
}
VariantInit( &vItem );
hResult = SafeArrayGetElement( pSArray, &uIndex, &vItem );
ASSERT( SUCCEEDED( hResult ) );
strTemp = VarToDisplayString( vItem, bMultiValued, FALSE );
VariantClear( &vItem );
strVal += strTemp;
if( strVal.GetLength( ) > 8096 )
break;
}
return strVal;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
CString COleDsOctetString::VarToDisplayString( VARIANT& var, BOOL bMultiValued, BOOL bUseEx )
{
if( bUseEx )
{
return VarToDisplayStringEx( var, bMultiValued );
}
if( bMultiValued )
{
return FromVariantArrayToString( var );
}
else
{
return FromVariantArrayToString( var );
}
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsOctetString::DisplayStringToDispParamsEx( CString& rText, DISPPARAMS& dispParams, BOOL bMultiValued )
{
SAFEARRAY* pSArray;
SAFEARRAYBOUND saBound;
HRESULT hResult;
LONG lIdx = LBOUND;
DisplayStringToDispParams( rText, dispParams, bMultiValued, FALSE );
if( !bMultiValued )
{
saBound.lLbound = LBOUND;
saBound.cElements = 1;
pSArray = SafeArrayCreate( VT_VARIANT, 1, &saBound );
hResult = SafeArrayPutElement( pSArray, &lIdx, &dispParams.rgvarg[0] );
VariantClear( &dispParams.rgvarg[0] );
V_VT( &dispParams.rgvarg[0] ) = VT_ARRAY | VT_VARIANT;
V_ARRAY( &dispParams.rgvarg[0] ) = pSArray;
}
return TRUE;
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
BOOL COleDsOctetString::DisplayStringToDispParams( CString& rText, DISPPARAMS& dispParams,
BOOL bMultiValued, BOOL bUseEx )
{
HRESULT hResult;
int x= 0;
if( bUseEx )
{
return DisplayStringToDispParamsEx( rText, dispParams, bMultiValued );
}
dispParams.rgdispidNamedArgs[ 0 ] = DISPID_PROPERTYPUT;
dispParams.cArgs = 1;
dispParams.cNamedArgs = 1;
if( bMultiValued )
{
hResult = CreateBlobArrayEx( rText, dispParams.rgvarg[0] );
}
else
{
hResult = CreateBlobArray( rText, dispParams.rgvarg[0] );
}
return SUCCEEDED( hResult );
}
/***********************************************************
Function:
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsOctetString::Native2Value( ADSVALUE* pADsObject,
CString& rVal )
{
DWORD dwItem;
LPBYTE lpByte;
TCHAR szText[ 128 ];
lpByte = pADsObject->OctetString.lpValue;
ASSERT( lpByte );
_tcscpy( szText, _T("[") );
_ultot( pADsObject->OctetString.dwLength, szText + _tcslen( szText ), 10 );
_tcscat( szText, _T("]") );
for( dwItem = 0L; dwItem < pADsObject->OctetString.dwLength ; dwItem++ )
{
#ifdef UNICODE
swprintf(
#else
sprintf(
#endif
szText + _tcslen(szText), _T(" x%02x"), lpByte[ dwItem ] );
if( _tcslen( szText ) > 120 )
break;
}
rVal = szText;
return S_OK;
}
/***********************************************************
Function: COleDsOctetString::Value2Native
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
HRESULT COleDsOctetString::Value2Native( ADSVALUE* pADsObject,
CString& rVal )
{
HRESULT hResult = E_FAIL;
TCHAR* strText;
LPBYTE lpByte;
int nSize, nItems, nIdx;
rVal.MakeUpper( );
strText = (TCHAR*) new TCHAR[ rVal.GetLength( ) + 1 ];
if( !strText )
{
return E_FAIL;
}
_tcscpy( strText, rVal.GetBuffer( rVal.GetLength( ) ) );
nSize = rVal.GetLength( );
nItems = 0;
for( nIdx = 0; nIdx < nSize ; nIdx++ )
{
if( strText[ nIdx ] == _T('X') )
{
nItems++;
}
}
lpByte = (LPBYTE) AllocADsMem( nItems );
ASSERT( lpByte );
if ( lpByte )
{
int nItems = 0;
for( nIdx = 0; nIdx < nSize ; nIdx++ )
{
if( strText[ nIdx ] == _T('X') )
{
lpByte[ nItems++] = GetByteValue( strText + nIdx + 1 );
while( nIdx < nSize && !isspace( strText[ nIdx ] ) )
nIdx++;
}
}
}
pADsObject->OctetString.lpValue = lpByte;
pADsObject->OctetString.dwLength = nItems;
delete [] strText;
return hResult;
}
/***********************************************************
Function: COleDsOctetString::FreeAttrValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
***********************************************************/
void COleDsOctetString::FreeAttrValue( ADSVALUE* pADsValue )
{
ASSERT( NULL != pADsValue->OctetString.lpValue );
FREE_MEMORY( pADsValue->OctetString.lpValue );
}
/*******************************************************************
Function: GetByteValue
Arguments:
Return:
Purpose:
Author(s):
Revision:
Date:
*******************************************************************/
BYTE COleDsOctetString::GetByteValue( TCHAR* szString )
{
BYTE bBytes[ 2 ];
bBytes[ 0 ] = bBytes[ 1 ] = 0;
for( int i = 0; i < 2 ; i++ )
{
if( !szString[ i ] )
break;
#ifdef UNICODE
if( !iswdigit( szString[ i ] ) )
{
bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x37;
}
#else
if( !isdigit( szString[ i ] ) )
{
bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x37;
}
#endif
else
{
bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x30;
}
}
return ( bBytes[ 0 ] << 4 ) + bBytes[ 1 ];
}