//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1996. // // File: ldap2var.cxx // // Contents: LDAP Object to Variant Copy Routines // // Functions: // // History: 25-Jun-96 yihsins Created. // // // Issues: // //---------------------------------------------------------------------------- #include "ldap.hxx" // // LdapType objects copy code // HRESULT LdapTypeToVarTypeString( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; pVarDestObject->vt = VT_BSTR; hr = ADsAllocString( LDAPOBJECT_STRING(pLdapSrcObject), &(pVarDestObject->bstrVal) ); RRETURN(hr); } HRESULT LdapTypeToVarTypeBoolean( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; LPTSTR pszSrc = LDAPOBJECT_STRING(pLdapSrcObject); pVarDestObject->vt = VT_BOOL; if ( _tcsicmp( pszSrc, TEXT("TRUE")) == 0 ) { pVarDestObject->boolVal = VARIANT_TRUE; } else if ( _tcsicmp( pszSrc, TEXT("FALSE")) == 0 ) { pVarDestObject->boolVal = VARIANT_FALSE; } else { hr = E_ADS_CANT_CONVERT_DATATYPE; } RRETURN(hr); } HRESULT LdapTypeToVarTypeInteger( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; pVarDestObject->vt = VT_I4; pVarDestObject->lVal = _ttol(LDAPOBJECT_STRING(pLdapSrcObject)); RRETURN(hr); } HRESULT LdapTypeToVarTypeSecDes( LPWSTR pszServerName, CCredentials& Credentials, PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; BOOL fNTDS = TRUE; pVarDestObject->vt = VT_DISPATCH; hr = ReadServerType( pszServerName, &Credentials, &fNTDS ); BAIL_ON_FAILURE(hr); hr = ConvertSecDescriptorToVariant( pszServerName, Credentials, LDAPOBJECT_BERVAL_VAL(pLdapSrcObject), pVarDestObject, fNTDS ); error: RRETURN(hr); } HRESULT LdapTypeToVarTypeLargeInteger( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; IADsLargeInteger * pLargeInteger = NULL; IDispatch * pDispatch = NULL; LARGE_INTEGER largeint; hr = CoCreateInstance( CLSID_LargeInteger, NULL, CLSCTX_INPROC_SERVER, IID_IADsLargeInteger, (void **) &pLargeInteger); BAIL_ON_FAILURE(hr); swscanf (LDAPOBJECT_STRING(pLdapSrcObject), L"%I64d", &largeint); hr = pLargeInteger->put_LowPart(largeint.LowPart); BAIL_ON_FAILURE(hr); hr = pLargeInteger->put_HighPart(largeint.HighPart); BAIL_ON_FAILURE(hr); hr = pLargeInteger->QueryInterface( IID_IDispatch, (void **) &pDispatch ); BAIL_ON_FAILURE(hr); V_VT(pVarDestObject) = VT_DISPATCH; V_DISPATCH(pVarDestObject) = pDispatch; error: if (pLargeInteger) { pLargeInteger->Release(); } RRETURN(hr); } HRESULT LdapTypeToVarTypeDNWithBinary( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; ADSVALUE AdsValue; IADsDNWithBinary *pDNWithBinary = NULL; IDispatch *pDispatch = NULL; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; CHAR HUGEP *pArray = NULL; BSTR bstrTemp = NULL; memset(&AdsValue, 0, sizeof(AdsValue)); hr = CoCreateInstance( CLSID_DNWithBinary, NULL, CLSCTX_INPROC_SERVER, IID_IADsDNWithBinary, (void **) &pDNWithBinary ); BAIL_ON_FAILURE(hr); // // Convert the ldapString to an adsvalue and then take it // to DNWithBinary object // hr = LdapTypeToAdsTypeDNWithBinary( pLdapSrcObject, &AdsValue ); BAIL_ON_FAILURE(hr); if (AdsValue.pDNWithBinary->pszDNString) { hr = ADsAllocString(AdsValue.pDNWithBinary->pszDNString, &bstrTemp); BAIL_ON_FAILURE(hr); // // Put the value in the object - we can only set BSTR's // hr = pDNWithBinary->put_DNString(bstrTemp); BAIL_ON_FAILURE(hr); } aBound.lLbound = 0; aBound.cElements = AdsValue.pDNWithBinary->dwLength; aList = SafeArrayCreate( VT_UI1, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } hr = SafeArrayAccessData( aList, (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy( pArray, AdsValue.pDNWithBinary->lpBinaryValue, aBound.cElements ); SafeArrayUnaccessData( aList ); V_VT(pVarDestObject) = VT_ARRAY | VT_UI1; V_ARRAY(pVarDestObject) = aList; hr = pDNWithBinary->put_BinaryValue(*pVarDestObject); VariantClear(pVarDestObject); BAIL_ON_FAILURE(hr); hr = pDNWithBinary->QueryInterface( IID_IDispatch, (void **) &pDispatch ); BAIL_ON_FAILURE(hr); V_VT(pVarDestObject) = VT_DISPATCH; V_DISPATCH(pVarDestObject) = pDispatch; error: if (pDNWithBinary) { pDNWithBinary->Release(); } if (AdsValue.pDNWithBinary) { if (AdsValue.pDNWithBinary->lpBinaryValue) { FreeADsMem(AdsValue.pDNWithBinary->lpBinaryValue); } if (AdsValue.pDNWithBinary->pszDNString) { FreeADsStr(AdsValue.pDNWithBinary->pszDNString); } FreeADsMem(AdsValue.pDNWithBinary); } if (bstrTemp) { ADsFreeString(bstrTemp); } RRETURN(hr); } HRESULT LdapTypeToVarTypeDNWithString( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; ADSVALUE AdsValue; IADsDNWithString *pDNWithString = NULL; IDispatch *pDispatch = NULL; BSTR bstrStrVal = NULL; BSTR bstrDNVal = NULL; memset(&AdsValue, 0, sizeof(AdsValue)); hr = CoCreateInstance( CLSID_DNWithString, NULL, CLSCTX_INPROC_SERVER, IID_IADsDNWithString, (void **) &pDNWithString ); BAIL_ON_FAILURE(hr); // // Convert the ldapString to an adsvalue and then take it // to DNWithString object // hr = LdapTypeToAdsTypeDNWithString( pLdapSrcObject, &AdsValue ); BAIL_ON_FAILURE(hr); if (AdsValue.pDNWithString->pszDNString) { hr = ADsAllocString(AdsValue.pDNWithString->pszDNString, &bstrDNVal); BAIL_ON_FAILURE(hr); hr = pDNWithString->put_DNString(bstrDNVal); BAIL_ON_FAILURE(hr); } if (AdsValue.pDNWithString->pszStringValue) { hr = ADsAllocString( AdsValue.pDNWithString->pszStringValue, &bstrStrVal ); BAIL_ON_FAILURE(hr); hr = pDNWithString->put_StringValue(bstrStrVal); BAIL_ON_FAILURE(hr); } hr = pDNWithString->QueryInterface( IID_IDispatch, (void **) &pDispatch ); BAIL_ON_FAILURE(hr); V_VT(pVarDestObject) = VT_DISPATCH; V_DISPATCH(pVarDestObject) = pDispatch; error: if (pDNWithString) { pDNWithString->Release(); } if (AdsValue.pDNWithString) { if (AdsValue.pDNWithString->pszStringValue) { FreeADsStr(AdsValue.pDNWithString->pszStringValue); } if (AdsValue.pDNWithString->pszDNString) { FreeADsStr(AdsValue.pDNWithString->pszDNString); } FreeADsMem(AdsValue.pDNWithString); } if (bstrDNVal) { ADsFreeString(bstrDNVal); } if (bstrStrVal) { ADsFreeString(bstrStrVal); } RRETURN(hr); } HRESULT LdapTypeToVarTypeBinaryData( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; CHAR HUGEP *pArray = NULL; aBound.lLbound = 0; aBound.cElements = LDAPOBJECT_BERVAL_LEN(pLdapSrcObject); aList = SafeArrayCreate( VT_UI1, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } hr = SafeArrayAccessData( aList, (void HUGEP * FAR *) &pArray ); BAIL_ON_FAILURE(hr); memcpy( pArray, LDAPOBJECT_BERVAL_VAL(pLdapSrcObject), aBound.cElements ); SafeArrayUnaccessData( aList ); V_VT(pVarDestObject) = VT_ARRAY | VT_UI1; V_ARRAY(pVarDestObject) = aList; RRETURN(hr); error: if ( aList ) SafeArrayDestroy( aList ); RRETURN(hr); } HRESULT LdapTypeToVarTypeUTCTime( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; int nSuccess = 0; ADSVALUE AdsValue; pVarDestObject->vt = VT_DATE; // // This converts to a SYSTEMTIME. // hr = LdapTypeToAdsTypeUTCTime( pLdapSrcObject, &AdsValue); BAIL_ON_FAILURE(hr); nSuccess = SystemTimeToVariantTime( &AdsValue.UTCTime, &pVarDestObject->date ); if (!nSuccess) { hr =E_ADS_CANT_CONVERT_DATATYPE; BAIL_ON_FAILURE(hr); } error: RRETURN(hr); } HRESULT LdapTypeToVarTypeGeneralizedTime( PLDAPOBJECT pLdapSrcObject, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; BOOL fSuccess = FALSE; ADSVALUE AdsValue; pVarDestObject->vt = VT_DATE; // // This converts to a SYSTEMTIME. // hr = LdapTypeToAdsTypeGeneralizedTime( pLdapSrcObject, &AdsValue); BAIL_ON_FAILURE(hr); fSuccess = SystemTimeToVariantTime( &AdsValue.UTCTime, &pVarDestObject->date); if (!fSuccess) { BAIL_ON_FAILURE(hr = E_ADS_CANT_CONVERT_DATATYPE); } error: RRETURN(hr); } HRESULT LdapTypeToVarTypeCopy( LPWSTR pszServerName, CCredentials& Credentials, PLDAPOBJECT pLdapSrcObject, DWORD dwSyntaxId, PVARIANT pVarDestObject ) { HRESULT hr = S_OK; switch (dwSyntaxId) { 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 = LdapTypeToVarTypeString( pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_BOOLEAN: hr = LdapTypeToVarTypeBoolean( pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_INTEGER: hr = LdapTypeToVarTypeInteger( pLdapSrcObject, pVarDestObject ); 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: hr = LdapTypeToVarTypeBinaryData( pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_GENERALIZEDTIME: hr = LdapTypeToVarTypeGeneralizedTime( pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_UTCTIME: hr = LdapTypeToVarTypeUTCTime( pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_SECURITY_DESCRIPTOR: hr = LdapTypeToVarTypeSecDes( pszServerName, Credentials, pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_INTEGER8: hr = LdapTypeToVarTypeLargeInteger( pLdapSrcObject, pVarDestObject ); break; #if 0 case LDAPTYPE_CASEEXACTLIST: case LDAPTYPE_CASEIGNORELIST: #endif case LDAPTYPE_DNWITHBINARY: hr = LdapTypeToVarTypeDNWithBinary( pLdapSrcObject, pVarDestObject ); break; case LDAPTYPE_DNWITHSTRING: hr = LdapTypeToVarTypeDNWithString( pLdapSrcObject, pVarDestObject ); break; default: // // LDAPTYPE_UNKNOWN (schemaless server property) will be // not be converted. // hr = E_ADS_CANT_CONVERT_DATATYPE; break; } RRETURN(hr); } HRESULT LdapTypeToVarTypeCopyConstruct( LPWSTR pszServerName, CCredentials& Credentials, LDAPOBJECTARRAY ldapSrcObjects, DWORD dwSyntaxId, PVARIANT pVarDestObjects ) { long i = 0; HRESULT hr = S_OK; VariantInit( pVarDestObjects ); // // The following are for handling are multi-value properties // SAFEARRAY *aList = NULL; SAFEARRAYBOUND aBound; aBound.lLbound = 0; aBound.cElements = ldapSrcObjects.dwCount; aList = SafeArrayCreate( VT_VARIANT, 1, &aBound ); if ( aList == NULL ) { hr = E_OUTOFMEMORY; BAIL_ON_FAILURE(hr); } for ( i = 0; i < (long) ldapSrcObjects.dwCount; i++ ) { VARIANT v; VariantInit(&v); hr = LdapTypeToVarTypeCopy( pszServerName, Credentials, ldapSrcObjects.pLdapObjects + i, dwSyntaxId, &v ); BAIL_ON_FAILURE(hr); hr = SafeArrayPutElement( aList, &i, &v ); VariantClear(&v); BAIL_ON_FAILURE(hr); } V_VT(pVarDestObjects) = VT_ARRAY | VT_VARIANT; V_ARRAY(pVarDestObjects) = aList; RRETURN(S_OK); error: if ( aList ) SafeArrayDestroy( aList ); RRETURN(hr); }