202 lines
4.0 KiB
C++
202 lines
4.0 KiB
C++
/* ----------------------------------------------------------------------
|
|
|
|
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 ----------- */
|