WindowsXP-SP1/enduser/netmeeting/ulsldap/spstdatt.cpp
2020-09-30 16:53:49 +02:00

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 ----------- */