|
|
/* ----------------------------------------------------------------------
Module: ULS.DLL (Service Provider) File: spstdatt.cpp Content: This file contains the standard-attribute object. History: 10/15/96 Chu, Lon-Chan [lonchanc] Created.
Copyright (c) Microsoft Corporation 1996-1997
---------------------------------------------------------------------- */
#include "ulsp.h"
#include "spinc.h"
/* ---------- public methods ----------- */
UlsLdap_CStdAttrs::UlsLdap_CStdAttrs ( VOID ) { }
UlsLdap_CStdAttrs::~UlsLdap_CStdAttrs ( VOID ) { }
/* ---------- protected methods ----------- */
HRESULT UlsLdap_CStdAttrs::SetStdAttrs ( ULONG *puRespID, ULONG *puMsgID, ULONG uNotifyMsg, VOID *pInfo, SERVER_INFO *pServerInfo, TCHAR *pszDN ) { MyAssert (puRespID != NULL || puMsgID != NULL); MyAssert (pInfo != NULL); MyAssert (pServerInfo != NULL); MyAssert (pszDN != NULL);
// cache info
//
HRESULT hr = CacheInfo (pInfo); if (hr != S_OK) return hr;
// Build modify array for ldap_modify()
//
LDAPMod **ppMod = NULL; hr = CreateSetStdAttrsModArr (&ppMod); if (hr != S_OK) return hr; MyAssert (ppMod != NULL);
// so far, we are done with local preparation
//
// Get the session object
//
UlsLdap_CSession *pSession = NULL; hr = g_pSessionContainer->GetSession (&pSession, pServerInfo); if (hr != S_OK) { MemFree (ppMod); return hr; } MyAssert (pSession != NULL);
// Get the ldap session
//
LDAP *ld = pSession->GetLd (); MyAssert (ld != NULL);
// Send the data over the wire
//
ULONG uMsgID = ldap_modify (ld, pszDN, ppMod); MemFree (ppMod); if (uMsgID == -1) { hr = ::LdapError2Hresult (ld->ld_errno); pSession->Disconnect (); return hr; }
// If the caller requests a response id,
// then submit this pending item.
// else free up the session object
//
if (puRespID != NULL) { // Initialize pending info
//
PENDING_INFO PendingInfo; ::FillDefPendingInfo (&PendingInfo, ld, uMsgID, INVALID_MSG_ID); PendingInfo.uLdapResType = LDAP_RES_MODIFY; PendingInfo.uNotifyMsg = uNotifyMsg;
// Queue it
//
hr = g_pPendingQueue->EnterRequest (pSession, &PendingInfo); if (hr != S_OK) { // If queueing failed, then clean up
//
ldap_abandon (ld, uMsgID); pSession->Disconnect (); MyAssert (FALSE); }
// Return the reponse id
//
*puRespID = PendingInfo.uRespID; } else { // Free up session (i.e. decrement the reference count)
//
pSession->Disconnect (); }
if (puMsgID != NULL) *puMsgID = uMsgID;
return hr; }
HRESULT FillDefStdAttrsModArr ( LDAPMod ***pppMod, DWORD dwFlags, ULONG cMaxAttrs, ULONG *pcTotal, // in/out parameter!!!
LONG IsbuModOp, ULONG cPrefix, TCHAR *pszPrefix ) {
MyAssert (pppMod != NULL); MyAssert (pcTotal != NULL); MyAssert ( (cPrefix == 0 && pszPrefix == NULL) || (cPrefix != 0 && pszPrefix != NULL));
// Figure out the num of attributes
//
ULONG cAttrs = 0; for (ULONG i = 0; i < cMaxAttrs; i++) { if (dwFlags & 0x01) cAttrs++; dwFlags >>= 1; }
// Allocate modify list
//
ULONG cTotal = *pcTotal + cPrefix + cAttrs; ULONG cbMod = IlsCalcModifyListSize (cTotal); *pppMod = (LDAPMod **) MemAlloc (cbMod); if (*pppMod == NULL) return ULS_E_MEMORY;
// Fill in the modify list
//
LDAPMod *pMod; for (i = 0; i < cTotal; i++) { pMod = IlsGetModifyListMod (pppMod, cTotal, i); (*pppMod)[i] = pMod; pMod->mod_values = (TCHAR **) (pMod + 1);
if (i < cPrefix) { pMod->mod_op = LDAP_MOD_REPLACE; pMod->mod_type = pszPrefix; pszPrefix += lstrlen (pszPrefix) + 1; *(pMod->mod_values) = pszPrefix; pszPrefix += lstrlen (pszPrefix) + 1; } }
// Fix up the last one
//
IlsFixUpModOp ((*pppMod)[0], LDAP_MOD_REPLACE, IsbuModOp); (*pppMod)[cTotal] = NULL;
// Return the total number of entries if needed
//
if (pcTotal) *pcTotal = cTotal;
return S_OK; }
/* ---------- private methods ----------- */
|