//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: var2ldap.cxx // // Contents: Variant to LDAP object Copy Routines // // Functions: // // History: 25-Jun-96 yihsins Created. // // // Issues: // //---------------------------------------------------------------------------- #include "ldap.hxx" // // LdapType objects copy code // HRESULT VarTypeToLdapTypeString( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; DWORD nStrLen; if(pVarSrcObject->vt != VT_BSTR){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } if (!pVarSrcObject->bstrVal) { RRETURN(hr = E_ADS_BAD_PARAMETER); } nStrLen = _tcslen( pVarSrcObject->bstrVal ); LDAPOBJECT_STRING(pLdapDestObject) = (LPTSTR) AllocADsMem( (nStrLen + 1) * sizeof(TCHAR)); if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL) { hr = E_OUTOFMEMORY; RRETURN(hr); } if ( nStrLen == 0 ) { _tcscpy( LDAPOBJECT_STRING(pLdapDestObject), L""); RRETURN(S_OK); } _tcscpy( LDAPOBJECT_STRING(pLdapDestObject), pVarSrcObject->bstrVal ); RRETURN(S_OK); } HRESULT VarTypeToLdapTypeBoolean( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; LPTSTR pszStr = NULL; if(pVarSrcObject->vt != VT_BOOL){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } if ( pVarSrcObject->boolVal ) pszStr = TEXT("TRUE"); else pszStr = TEXT("FALSE"); LDAPOBJECT_STRING(pLdapDestObject) = (LPTSTR) AllocADsMem( (_tcslen(pszStr) + 1) * sizeof(TCHAR)); if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL) { RRETURN(hr = E_OUTOFMEMORY); } _tcscpy( LDAPOBJECT_STRING(pLdapDestObject), pszStr ); RRETURN(hr); } HRESULT VarTypeToLdapTypeUTCTime( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; int nSuccess = 0; ADSVALUE adsValue; DWORD dwSyntaxId = 0; if (pVarSrcObject->vt != VT_DATE) RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); adsValue.dwType = ADSTYPE_UTC_TIME; nSuccess = VariantTimeToSystemTime( pVarSrcObject->date, &adsValue.UTCTime ); if (!nSuccess) { hr = E_ADS_CANT_CONVERT_DATATYPE; BAIL_ON_FAILURE(hr); } hr = AdsTypeToLdapTypeCopyTime( &adsValue, pLdapDestObject, &dwSyntaxId ); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT VarTypeToLdapTypeGeneralizedTime( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; ADSVALUE adsValue; DWORD dwErr = 0; DWORD dwSyntaxId = 0; if (pVarSrcObject->vt != VT_DATE) RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); adsValue.dwType = ADSTYPE_UTC_TIME; dwErr = VariantTimeToSystemTime( pVarSrcObject->date, &adsValue.UTCTime ); if (dwErr != TRUE) { BAIL_ON_FAILURE(hr = E_ADS_CANT_CONVERT_DATATYPE); } hr = AdsTypeToLdapTypeCopyGeneralizedTime( &adsValue, pLdapDestObject, &dwSyntaxId ); BAIL_ON_FAILURE(hr); error: RRETURN(hr); } HRESULT VarTypeToLdapTypeInteger( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; TCHAR Buffer[64]; if( pVarSrcObject->vt != VT_I4 && pVarSrcObject->vt != VT_I2){ RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } if(pVarSrcObject->vt == VT_I4) _ltot( pVarSrcObject->lVal, Buffer, 10 ); else _itot( pVarSrcObject->iVal, Buffer, 10 ); LDAPOBJECT_STRING(pLdapDestObject) = (LPTSTR) AllocADsMem( (_tcslen(Buffer) + 1) * sizeof(TCHAR)); if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL) { hr = E_OUTOFMEMORY; RRETURN(hr); } _tcscpy( LDAPOBJECT_STRING(pLdapDestObject), Buffer ); RRETURN(hr); } HRESULT VarTypeToLdapTypeBinaryData( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; LONG dwSLBound = 0; LONG dwSUBound = 0; CHAR HUGEP *pArray = NULL; if( pVarSrcObject->vt != (VT_ARRAY | VT_UI1)) { RRETURN(hr = E_ADS_CANT_CONVERT_DATATYPE); } hr = SafeArrayGetLBound(V_ARRAY(pVarSrcObject), 1, (long FAR *) &dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound(V_ARRAY(pVarSrcObject), 1, (long FAR *) &dwSUBound ); BAIL_ON_FAILURE(hr); LDAPOBJECT_BERVAL(pLdapDestObject) = (struct berval *) AllocADsMem( sizeof(struct berval) + dwSUBound - dwSLBound + 1); if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwSUBound - dwSLBound + 1; LDAPOBJECT_BERVAL_VAL(pLdapDestObject) = (CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject) + sizeof(struct berval)); hr = SafeArrayAccessData( V_ARRAY(pVarSrcObject), (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject), pArray,dwSUBound-dwSLBound+1); SafeArrayUnaccessData( V_ARRAY(pVarSrcObject) ); error: RRETURN(hr); } HRESULT VarTypeToLdapTypeSecDes( LPWSTR pszServerName, CCredentials& Credentials, PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; IADsSecurityDescriptor FAR * pSecDes = NULL; PSECURITY_DESCRIPTOR pSecurityDescriptor = NULL; DWORD dwSDLength = 0; IDispatch FAR * pDispatch = NULL; BOOL fNTDS = TRUE; if (V_VT(pVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(pVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsSecurityDescriptor, (void **)&pSecDes ); BAIL_ON_FAILURE(hr); hr = ReadServerType( pszServerName, &Credentials, &fNTDS ); BAIL_ON_FAILURE(hr); hr = ConvertSecurityDescriptorToSecDes( pszServerName, Credentials, pSecDes, &pSecurityDescriptor, &dwSDLength, fNTDS ); BAIL_ON_FAILURE(hr); LDAPOBJECT_BERVAL(pLdapDestObject) = (struct berval *) AllocADsMem( sizeof(struct berval) + dwSDLength); if ( LDAPOBJECT_BERVAL(pLdapDestObject) == NULL) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } LDAPOBJECT_BERVAL_LEN(pLdapDestObject) = dwSDLength; LDAPOBJECT_BERVAL_VAL(pLdapDestObject) =(CHAR *) ((LPBYTE) LDAPOBJECT_BERVAL(pLdapDestObject) + sizeof(struct berval)); memcpy( LDAPOBJECT_BERVAL_VAL(pLdapDestObject), pSecurityDescriptor, dwSDLength); error: if (pSecurityDescriptor) { FreeADsMem(pSecurityDescriptor); } if (pSecDes) { pSecDes->Release(); } RRETURN(hr); } HRESULT VarTypeToLdapTypeLargeInteger( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; IDispatch FAR * pDispatch = NULL; IADsLargeInteger *pLargeInteger = NULL; TCHAR Buffer[64]; LARGE_INTEGER LargeInteger; if (V_VT(pVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(pVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsLargeInteger, (void **)&pLargeInteger ); BAIL_ON_FAILURE(hr); hr = pLargeInteger->get_HighPart(&LargeInteger.HighPart); BAIL_ON_FAILURE(hr); hr = pLargeInteger->get_LowPart((LONG*)&LargeInteger.LowPart); BAIL_ON_FAILURE(hr); swprintf (Buffer, L"%I64d", LargeInteger); LDAPOBJECT_STRING(pLdapDestObject) = (LPTSTR) AllocADsStr( Buffer ); if ( LDAPOBJECT_STRING(pLdapDestObject) == NULL ) { hr = E_OUTOFMEMORY; RRETURN(hr); } error: if (pLargeInteger) { pLargeInteger->Release(); } RRETURN(hr); } HRESULT VarTypeToLdapTypeDNWithBinary( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; IDispatch FAR * pDispatch = NULL; IADsDNWithBinary *pDNBinary = NULL; PADSVALUE pADsValue = NULL; VARIANT vBinary; BSTR bstrDN = NULL; LONG dwSLBound = 0; LONG dwSUBound = 0; DWORD dwSyntaxId = 0; DWORD dwLength = 0; LPBYTE lpByte = NULL; CHAR HUGEP *pArray = NULL; VariantInit(&vBinary); if (V_VT(pVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(pVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsDNWithBinary, (void **)&pDNBinary ); BAIL_ON_FAILURE(hr); // // Convert to ADSVALUE and then to ldap representation. // This way the code to and from LDAP lives in one place. // hr = pDNBinary->get_BinaryValue(&vBinary); BAIL_ON_FAILURE(hr); if ((vBinary.vt != (VT_ARRAY | VT_UI1)) && vBinary.vt != VT_EMPTY) { BAIL_ON_FAILURE(hr = E_FAIL); } hr = pDNBinary->get_DNString(&bstrDN); BAIL_ON_FAILURE(hr); // // Get the byte array in a usable format. // hr = SafeArrayGetLBound( V_ARRAY(&vBinary), 1, (long FAR *) &dwSLBound ); BAIL_ON_FAILURE(hr); hr = SafeArrayGetUBound( V_ARRAY(&vBinary), 1, (long FAR *) &dwSUBound ); BAIL_ON_FAILURE(hr); dwLength = dwSUBound - dwSLBound + 1; lpByte = (LPBYTE) AllocADsMem(dwLength); if (dwLength && !lpByte) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } hr = SafeArrayAccessData( V_ARRAY(&vBinary), (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy(lpByte, pArray, dwLength); SafeArrayUnaccessData( V_ARRAY(&vBinary) ); pADsValue = (PADSVALUE) AllocADsMem(sizeof(ADSVALUE)); if (!pADsValue) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } pADsValue->dwType = ADSTYPE_DN_WITH_BINARY; pADsValue->pDNWithBinary = (PADS_DN_WITH_BINARY) AllocADsMem(sizeof(ADS_DN_WITH_BINARY)); if (!pADsValue->pDNWithBinary) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } pADsValue->pDNWithBinary->dwLength = dwLength; pADsValue->pDNWithBinary->lpBinaryValue = lpByte; pADsValue->pDNWithBinary->pszDNString = AllocADsStr(bstrDN); if (bstrDN && !pADsValue->pDNWithBinary->pszDNString) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } // // At this point the ADSIValue object is ready // hr = AdsTypeToLdapTypeCopyDNWithBinary( pADsValue, pLdapDestObject, &dwSyntaxId ); BAIL_ON_FAILURE(hr); error: if (pDNBinary) { pDNBinary->Release(); } VariantClear(&vBinary); if (bstrDN) { ADsFreeString(bstrDN); } // // Since we just have ptr to the byte array in the adsvalue // struct, if that is freed, we do not have to seperately // free the lpByte - if not we have to. // if (pADsValue) { // // Maybe we should replace with ADsTypeFreeAdsObjects. // if (pADsValue->pDNWithBinary) { if (pADsValue->pDNWithBinary->pszDNString) { FreeADsStr(pADsValue->pDNWithBinary->pszDNString); } if (pADsValue->pDNWithBinary->lpBinaryValue) { FreeADsMem(pADsValue->pDNWithBinary->lpBinaryValue); } FreeADsMem(pADsValue->pDNWithBinary); } FreeADsMem(pADsValue); } else if (lpByte) { FreeADsMem(lpByte); } RRETURN(hr); } HRESULT VarTypeToLdapTypeDNWithString( PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject ) { HRESULT hr = S_OK; IDispatch FAR * pDispatch = NULL; IADsDNWithString *pDNString = NULL; PADSVALUE pADsValue = NULL; BSTR bstrStringValue = NULL; BSTR bstrDN = NULL; DWORD dwSyntaxId = 0; DWORD dwLength = 0; if (V_VT(pVarSrcObject) != VT_DISPATCH){ hr = E_FAIL; BAIL_ON_FAILURE(hr); } pDispatch = V_DISPATCH(pVarSrcObject); hr = pDispatch->QueryInterface( IID_IADsDNWithString, (void **)&pDNString ); BAIL_ON_FAILURE(hr); // // Convert to ADSVALUE and then to ldap representation. // This way the code to and from LDAP lives in one place. // hr = pDNString->get_StringValue(&bstrStringValue); BAIL_ON_FAILURE(hr); hr = pDNString->get_DNString(&bstrDN); BAIL_ON_FAILURE(hr); pADsValue = (PADSVALUE) AllocADsMem(sizeof(ADSVALUE)); if (!pADsValue) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } pADsValue->dwType = ADSTYPE_DN_WITH_STRING; pADsValue->pDNWithString = (PADS_DN_WITH_STRING) AllocADsMem(sizeof(ADS_DN_WITH_STRING)); if (!pADsValue->pDNWithString) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } // // Put String value in the DNString struct. // pADsValue->pDNWithString->pszStringValue = AllocADsStr(bstrStringValue); if (bstrStringValue && !pADsValue->pDNWithString->pszStringValue) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } pADsValue->pDNWithString->pszDNString = AllocADsStr(bstrDN); if (bstrDN && !pADsValue->pDNWithString->pszDNString) { BAIL_ON_FAILURE(hr = E_OUTOFMEMORY); } // // At this point the ADSIValue object is ready // hr = AdsTypeToLdapTypeCopyDNWithString( pADsValue, pLdapDestObject, &dwSyntaxId ); BAIL_ON_FAILURE(hr); error: if (pDNString) { pDNString->Release(); } if (bstrStringValue) { ADsFreeString(bstrStringValue); } if (bstrDN) { ADsFreeString(bstrDN); } if (pADsValue) { // // Maybe we should replace with ADsTypeFreeAdsObjects. // if (pADsValue->pDNWithString) { if (pADsValue->pDNWithString->pszDNString) { FreeADsStr(pADsValue->pDNWithString->pszDNString); } if (pADsValue->pDNWithString->pszStringValue) { FreeADsMem(pADsValue->pDNWithString->pszStringValue); } FreeADsMem(pADsValue->pDNWithString); } FreeADsMem(pADsValue); } RRETURN(hr); } HRESULT VarTypeToLdapTypeCopy( LPWSTR pszServerName, CCredentials& Credentials, DWORD dwLdapType, PVARIANT pVarSrcObject, PLDAPOBJECT pLdapDestObject, BOOL *pfIsString ) { HRESULT hr = S_OK; *pfIsString = TRUE; // This will only be FALSE when the variant // contains binary data switch (dwLdapType){ case LDAPTYPE_BITSTRING: case LDAPTYPE_PRINTABLESTRING: case LDAPTYPE_DIRECTORYSTRING: case LDAPTYPE_COUNTRYSTRING: case LDAPTYPE_DN: case LDAPTYPE_NUMERICSTRING: case LDAPTYPE_IA5STRING: case LDAPTYPE_CASEIGNORESTRING: case LDAPTYPE_CASEEXACTSTRING: // case LDAPTYPE_CASEIGNOREIA5STRING: case LDAPTYPE_OID: case LDAPTYPE_TELEPHONENUMBER: case LDAPTYPE_ATTRIBUTETYPEDESCRIPTION: case LDAPTYPE_OBJECTCLASSDESCRIPTION: // // These types are treatable as strings // (see RFCs 2252, 2256) // case LDAPTYPE_DELIVERYMETHOD: case LDAPTYPE_ENHANCEDGUIDE: case LDAPTYPE_FACSIMILETELEPHONENUMBER: case LDAPTYPE_GUIDE: case LDAPTYPE_NAMEANDOPTIONALUID: case LDAPTYPE_POSTALADDRESS: case LDAPTYPE_PRESENTATIONADDRESS: case LDAPTYPE_TELEXNUMBER: case LDAPTYPE_DSAQUALITYSYNTAX: case LDAPTYPE_DATAQUALITYSYNTAX: case LDAPTYPE_MAILPREFERENCE: case LDAPTYPE_OTHERMAILBOX: case LDAPTYPE_ACCESSPOINTDN: case LDAPTYPE_ORNAME: case LDAPTYPE_ORADDRESS: hr = VarTypeToLdapTypeString( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_BOOLEAN: hr = VarTypeToLdapTypeBoolean( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_INTEGER: hr = VarTypeToLdapTypeInteger( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_OCTETSTRING: case LDAPTYPE_CERTIFICATE: case LDAPTYPE_CERTIFICATELIST: case LDAPTYPE_CERTIFICATEPAIR: case LDAPTYPE_PASSWORD: case LDAPTYPE_TELETEXTERMINALIDENTIFIER: case LDAPTYPE_AUDIO: case LDAPTYPE_JPEG: case LDAPTYPE_FAX: *pfIsString = FALSE; hr = VarTypeToLdapTypeBinaryData( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_GENERALIZEDTIME: hr = VarTypeToLdapTypeGeneralizedTime( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_UTCTIME: hr = VarTypeToLdapTypeUTCTime( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_SECURITY_DESCRIPTOR: *pfIsString = FALSE; hr = VarTypeToLdapTypeSecDes( pszServerName, Credentials, pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_INTEGER8: hr = VarTypeToLdapTypeLargeInteger( pVarSrcObject, pLdapDestObject ); break; #if 0 case LDAPTYPE_CASEEXACTLIST: case LDAPTYPE_CASEIGNORELIST: #endif case LDAPTYPE_DNWITHBINARY: hr = VarTypeToLdapTypeDNWithBinary( pVarSrcObject, pLdapDestObject ); break; case LDAPTYPE_DNWITHSTRING: hr = VarTypeToLdapTypeDNWithString( pVarSrcObject, pLdapDestObject ); break; default: hr = E_ADS_CANT_CONVERT_DATATYPE; break; } RRETURN(hr); } HRESULT VarTypeToLdapTypeCopyConstruct( LPWSTR pszServerName, CCredentials& Credentials, DWORD dwLdapType, LPVARIANT pVarSrcObjects, DWORD dwNumObjects, LDAPOBJECTARRAY *pLdapDestObjects ) { DWORD i = 0; HRESULT hr = S_OK; if ( dwNumObjects == 0 ) { pLdapDestObjects->dwCount = 0; pLdapDestObjects->pLdapObjects = NULL; RRETURN(S_OK); } pLdapDestObjects->pLdapObjects = (PLDAPOBJECT)AllocADsMem( dwNumObjects * sizeof(LDAPOBJECT)); if (pLdapDestObjects->pLdapObjects == NULL) RRETURN(E_OUTOFMEMORY); pLdapDestObjects->dwCount = dwNumObjects; for (i = 0; i < dwNumObjects; i++ ) { hr = VarTypeToLdapTypeCopy( pszServerName, Credentials, dwLdapType, pVarSrcObjects + i, pLdapDestObjects->pLdapObjects + i, &(pLdapDestObjects->fIsString) ); BAIL_ON_FAILURE(hr); } RRETURN(S_OK); error: LdapTypeFreeLdapObjects( pLdapDestObjects ); RRETURN(hr); } HRESULT GetLdapSyntaxFromVariant( VARIANT * pvProp, PDWORD pdwSyntaxId, LPTSTR pszServer, LPTSTR pszAttrName, CCredentials& Credentials, DWORD dwPort ) { // IADsSecurityDescriptor * pSecDes = NULL; // IADsLargeInteger * pLargeInt = NULL; IDispatch * pDispObj = NULL; IDispatch * pDispatch = NULL; HRESULT hr = S_OK; if (!pvProp) { hr = E_FAIL; BAIL_ON_FAILURE(hr); } switch (pvProp->vt) { case VT_BSTR: *pdwSyntaxId = LDAPTYPE_CASEIGNORESTRING; break; case VT_I8: *pdwSyntaxId = LDAPTYPE_INTEGER8; break; case VT_I4: *pdwSyntaxId = LDAPTYPE_INTEGER; break; case VT_I2: *pdwSyntaxId = LDAPTYPE_INTEGER; break; case VT_BOOL: *pdwSyntaxId = LDAPTYPE_BOOLEAN; break; case VT_DATE: // // We need to determine if it is a GeneralizedTime // or UTCTime property. If the lookup fails on the // server we will failover to GenTime. // hr = E_FAIL; if (pszAttrName) { // // pszAttrName will be null if we are coming in // from the property cache on putproperty // hr = LdapGetSyntaxOfAttributeOnServer( pszServer, pszAttrName, pdwSyntaxId, Credentials, dwPort ); } if (FAILED(hr)) { // Default to GenTime *pdwSyntaxId = LDAPTYPE_GENERALIZEDTIME; } break; case (VT_ARRAY | VT_UI1): *pdwSyntaxId = LDAPTYPE_OCTETSTRING; break; case (VT_DISPATCH): pDispatch = V_DISPATCH(pvProp); // Security Descriptor hr = pDispatch->QueryInterface( IID_IADsSecurityDescriptor, (void **)&pDispObj ); if (SUCCEEDED(hr)) { pDispObj->Release(); *pdwSyntaxId = LDAPTYPE_SECURITY_DESCRIPTOR; break; } // Large Integer hr = pDispatch->QueryInterface( IID_IADsLargeInteger, (void **)&pDispObj ); if (SUCCEEDED(hr)) { pDispObj->Release(); *pdwSyntaxId = LDAPTYPE_INTEGER8; break; } // DN With Binary hr = pDispatch->QueryInterface( IID_IADsDNWithBinary, (void **)&pDispObj ); if (SUCCEEDED(hr)) { pDispObj->Release(); *pdwSyntaxId = LDAPTYPE_DNWITHBINARY; break; } // DN With String hr = pDispatch->QueryInterface( IID_IADsDNWithString, (void **)&pDispObj ); if (SUCCEEDED(hr)) { pDispObj->Release(); *pdwSyntaxId = LDAPTYPE_DNWITHSTRING; break; } BAIL_ON_FAILURE(hr = E_ADS_BAD_PARAMETER) break; default: RRETURN(E_FAIL); } RRETURN(S_OK); error: RRETURN(hr); }