4347 lines
91 KiB
C++
4347 lines
91 KiB
C++
|
||
/* ----------------------------------------------------------------------
|
||
|
||
Module: ULS.DLL (Service Provider)
|
||
File: ldapsp.cpp
|
||
Content: This file contains the ldap service provider interface.
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
|
||
Copyright (c) Microsoft Corporation 1996-1997
|
||
|
||
---------------------------------------------------------------------- */
|
||
|
||
#include "ulsp.h"
|
||
#include "spinc.h"
|
||
|
||
// Window handle of this layer's hidden window
|
||
//
|
||
HWND g_hWndHidden = NULL;
|
||
|
||
// Window handle of the COM layer's hidden window
|
||
//
|
||
HWND g_hWndNotify = NULL;
|
||
|
||
// Internal request thread
|
||
//
|
||
HANDLE g_hReqThread = NULL;
|
||
DWORD g_dwReqThreadID = 0;
|
||
|
||
// Hidden window class
|
||
//
|
||
extern TCHAR c_szWindowClassName[];
|
||
|
||
// Global generator for response ID
|
||
//
|
||
ULONG g_uRespID = 1;
|
||
|
||
// Global
|
||
//
|
||
DWORD g_dwClientSig = 0;
|
||
|
||
// Global counter for the times of initializations
|
||
//
|
||
LONG g_cInitialized = 0;
|
||
|
||
|
||
// Internal functions prototypes
|
||
//
|
||
VOID BuildStdAttrNameArray ( VOID );
|
||
TCHAR *AddBaseToFilter ( TCHAR *, const TCHAR * );
|
||
HRESULT _EnumClientsEx ( ULONG, TCHAR *, TCHAR *, ULONG, TCHAR *, LDAP_ASYNCINFO * );
|
||
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_Initialize
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT UlsLdap_Initialize ( HWND hWndCallback )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is not initialized twice
|
||
//
|
||
if (g_cInitialized++ != 0)
|
||
return S_OK;
|
||
|
||
#ifdef DEBUG
|
||
// Validate handler table
|
||
//
|
||
extern VOID DbgValidateHandlerTable ( VOID );
|
||
DbgValidateHandlerTable ();
|
||
#endif
|
||
|
||
// Validate standard attribute name table
|
||
//
|
||
#ifdef DEBUG
|
||
extern VOID DbgValidateStdAttrNameArray ( VOID );
|
||
DbgValidateStdAttrNameArray ();
|
||
#endif
|
||
|
||
// Clean up the events for safe rollback
|
||
//
|
||
ZeroMemory (&g_ahThreadWaitFor[0], NUM_THREAD_WAIT_FOR * sizeof (HANDLE));
|
||
|
||
// Initialize global settings via registry
|
||
//
|
||
if (! GetRegistrySettings ())
|
||
{
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
// Make sure the uls window handle is valid
|
||
//
|
||
if (! MyIsWindow (hWndCallback))
|
||
{
|
||
MyAssert (FALSE);
|
||
g_cInitialized--;
|
||
MyAssert (g_cInitialized == 0);
|
||
return ILS_E_HANDLE;
|
||
}
|
||
|
||
// Cache the uls window handle
|
||
//
|
||
g_hWndNotify = hWndCallback;
|
||
|
||
// Initialize ILS specifics
|
||
//
|
||
hr = IlsInitialize ();
|
||
if (hr != S_OK)
|
||
return hr;
|
||
|
||
// Create events for inter-thread synchronization
|
||
//
|
||
g_fExitNow = FALSE;
|
||
for (INT i = 0; i < NUM_THREAD_WAIT_FOR; i++)
|
||
{
|
||
g_ahThreadWaitFor[i] = CreateEvent (NULL, // no security
|
||
FALSE, // auto reset
|
||
FALSE, // not signaled initially
|
||
NULL); // no event name
|
||
if (g_ahThreadWaitFor[i] == NULL)
|
||
{
|
||
hr = ILS_E_FAIL;
|
||
goto MyExit;
|
||
}
|
||
}
|
||
|
||
// Create an internal session container
|
||
//
|
||
g_pSessionContainer = new SP_CSessionContainer;
|
||
if (g_pSessionContainer == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Initialize the internal session container
|
||
//
|
||
hr = g_pSessionContainer->Initialize (8, NULL);
|
||
if (hr != S_OK)
|
||
goto MyExit;
|
||
|
||
// Create an internal pending request queue
|
||
//
|
||
g_pReqQueue = new SP_CRequestQueue;
|
||
if (g_pReqQueue == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an internal pending response queue
|
||
//
|
||
g_pRespQueue = new SP_CResponseQueue;
|
||
if (g_pRespQueue == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an internal refresh scheduler
|
||
//
|
||
g_pRefreshScheduler = new SP_CRefreshScheduler;
|
||
if (g_pRefreshScheduler == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create the hidden window
|
||
//
|
||
if (! MyCreateWindow ())
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Start WSA for subsequent host query in this service provider
|
||
//
|
||
WSADATA WSAData;
|
||
if (WSAStartup (MAKEWORD (1, 1), &WSAData))
|
||
{
|
||
hr = ILS_E_WINSOCK;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an internal hidden request thread that
|
||
// sends request and keep alive messages
|
||
//
|
||
g_hReqThread = CreateThread (NULL, 0,
|
||
ReqThread,
|
||
NULL, 0,
|
||
&g_dwReqThreadID);
|
||
if (g_hReqThread == NULL)
|
||
{
|
||
hr = ILS_E_THREAD;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Everything seems successful
|
||
//
|
||
hr = S_OK;
|
||
|
||
MyExit:
|
||
|
||
if (hr != S_OK)
|
||
{
|
||
// Something wrong, roll back
|
||
//
|
||
g_cInitialized--;
|
||
|
||
for (i = 0; i < NUM_THREAD_WAIT_FOR; i++)
|
||
{
|
||
if (g_ahThreadWaitFor[i] != NULL)
|
||
{
|
||
CloseHandle (g_ahThreadWaitFor[i]);
|
||
g_ahThreadWaitFor[i] = NULL;
|
||
}
|
||
}
|
||
|
||
IlsCleanup ();
|
||
|
||
if (g_pSessionContainer != NULL)
|
||
{
|
||
delete g_pSessionContainer;
|
||
g_pSessionContainer = NULL;
|
||
}
|
||
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
delete g_pReqQueue;
|
||
g_pReqQueue = NULL;
|
||
}
|
||
|
||
if (g_pRespQueue != NULL)
|
||
{
|
||
delete g_pRespQueue;
|
||
g_pRespQueue = NULL;
|
||
}
|
||
|
||
if (g_pRefreshScheduler != NULL)
|
||
{
|
||
delete g_pRefreshScheduler;
|
||
g_pRefreshScheduler = NULL;
|
||
}
|
||
|
||
// Unconditional call to WSACleanup() will not cause any problem
|
||
// because it simply returns WSAEUNINITIALIZED.
|
||
//
|
||
WSACleanup ();
|
||
|
||
MyAssert (g_hReqThread == NULL);
|
||
MyAssert (g_cInitialized == 0);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_Deinitialize
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT UlsLdap_Deinitialize ( VOID )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (--g_cInitialized != 0)
|
||
{
|
||
if (g_cInitialized < 0)
|
||
{
|
||
MyAssert (FALSE);
|
||
g_cInitialized = 0;
|
||
return ILS_E_NOT_INITIALIZED;
|
||
}
|
||
return S_OK;
|
||
}
|
||
|
||
// Make sure we have a valid internal hidden window handle
|
||
//
|
||
if (MyIsWindow (g_hWndHidden))
|
||
{
|
||
// Kill poll timer
|
||
//
|
||
KillTimer (g_hWndHidden, ID_TIMER_POLL_RESULT);
|
||
|
||
// Destroy the hidden window
|
||
//
|
||
DestroyWindow (g_hWndHidden);
|
||
|
||
// Unregister the window class
|
||
//
|
||
UnregisterClass (c_szWindowClassName, g_hInstance);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
// Is the request thread alive?
|
||
//
|
||
if (g_hReqThread != NULL)
|
||
{
|
||
// Signal the request thread to exit
|
||
//
|
||
SetEvent (g_hevExitReqThread);
|
||
g_fExitNow = TRUE;
|
||
|
||
// Wait for the request thread to respond
|
||
//
|
||
DWORD dwResult;
|
||
#define REQ_THREAD_EXIT_TIMEOUT 10000 // 10 seconds timeout
|
||
ULONG tcTimeout = REQ_THREAD_EXIT_TIMEOUT;
|
||
ULONG tcTarget = GetTickCount () + tcTimeout;
|
||
do
|
||
{
|
||
dwResult = (g_hReqThread != NULL) ?
|
||
MsgWaitForMultipleObjects (
|
||
1,
|
||
&g_hReqThread,
|
||
FALSE,
|
||
tcTimeout,
|
||
QS_ALLINPUT) :
|
||
WAIT_OBJECT_0;
|
||
|
||
if (dwResult == (WAIT_OBJECT_0 + 1))
|
||
{
|
||
// Insure that this thread continues to respond
|
||
//
|
||
if (! KeepUiResponsive ())
|
||
{
|
||
dwResult = WAIT_TIMEOUT;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Make sure we only wait for 90 seconds totally
|
||
//
|
||
tcTimeout = tcTarget - GetTickCount ();
|
||
}
|
||
// If the thread does not exit, let's continue to wait.
|
||
//
|
||
while ( dwResult == (WAIT_OBJECT_0 + 1) &&
|
||
tcTimeout <= REQ_THREAD_EXIT_TIMEOUT);
|
||
|
||
// Make sure we propagate back the error that
|
||
// the internal request thread is not responding
|
||
//
|
||
if (dwResult == WAIT_TIMEOUT)
|
||
{
|
||
#ifdef _DEBUG
|
||
DBG_REF("ULS Terminating internal thread");
|
||
#endif
|
||
hr = ILS_E_THREAD;
|
||
TerminateThread (g_hReqThread, (DWORD) -1);
|
||
}
|
||
|
||
// Clean up the internal hidden thread descriptor
|
||
//
|
||
CloseHandle (g_hReqThread);
|
||
g_hReqThread = NULL;
|
||
g_dwReqThreadID = 0;
|
||
} // if (g_hReqThread != NULL)
|
||
|
||
// Clean up inter-thread synchronization
|
||
//
|
||
for (INT i = 0; i < NUM_THREAD_WAIT_FOR; i++)
|
||
{
|
||
if (g_ahThreadWaitFor[i] != NULL)
|
||
{
|
||
CloseHandle (g_ahThreadWaitFor[i]);
|
||
g_ahThreadWaitFor[i] = NULL;
|
||
}
|
||
}
|
||
|
||
IlsCleanup();
|
||
|
||
// Free the internal session container
|
||
//
|
||
if (g_pSessionContainer != NULL)
|
||
{
|
||
delete g_pSessionContainer;
|
||
g_pSessionContainer = NULL;
|
||
}
|
||
|
||
// Free the internal pending request queue
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
delete g_pReqQueue;
|
||
g_pReqQueue = NULL;
|
||
}
|
||
|
||
// Free the internal pending response queue
|
||
//
|
||
if (g_pRespQueue != NULL)
|
||
{
|
||
delete g_pRespQueue;
|
||
g_pRespQueue = NULL;
|
||
}
|
||
|
||
// Free the refresh scheduler object
|
||
//
|
||
if (g_pRefreshScheduler != NULL)
|
||
{
|
||
delete g_pRefreshScheduler;
|
||
g_pRefreshScheduler = NULL;
|
||
}
|
||
|
||
// Unconditional call to WSACleanup() will not cause any problem
|
||
// because it simply returns WSAEUNINITIALIZED.
|
||
//
|
||
WSACleanup ();
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_Cancel
|
||
|
||
History:
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT UlsLdap_Cancel ( ULONG uMsgID )
|
||
{
|
||
HRESULT hr = ILS_E_FAIL;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
if (g_pRespQueue == NULL || g_pReqQueue == NULL)
|
||
{
|
||
MyAssert (FALSE);
|
||
return ILS_E_FAIL;
|
||
}
|
||
|
||
// The locking order is
|
||
// Lock(PendingOpQueue), Lock(RequestQueue), Lock (CurrOp)
|
||
//
|
||
g_pRespQueue->WriteLock ();
|
||
g_pReqQueue->WriteLock ();
|
||
g_pReqQueue->LockCurrOp ();
|
||
|
||
// Redirect the call to the pending op queue object
|
||
//
|
||
hr = g_pRespQueue->Cancel (uMsgID);
|
||
if (hr != S_OK)
|
||
{
|
||
// Redirect the call to the request queue object
|
||
//
|
||
hr = g_pReqQueue->Cancel (uMsgID);
|
||
}
|
||
|
||
// Unlock is always in the reverse order of lock
|
||
//
|
||
g_pReqQueue->UnlockCurrOp ();
|
||
g_pReqQueue->WriteUnlock ();
|
||
g_pRespQueue->WriteUnlock ();
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_Cancel ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_CANCEL);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
ULONG uRespID = (ULONG) MarshalReq_GetParam (pReq, 0);
|
||
|
||
// Cancelling in request queue is easy and done in UlsLdap_Cancel()
|
||
// because the request is not sent to the server yet.
|
||
// Cancelling in CurrOp is also easy because the request thread will
|
||
// find out that the current request is cancelled and then can call
|
||
// g_pRespQueue->Cancel() in the request thread (not UI thread).
|
||
// Cancelling in pending op queue is tricky. I have to marshal it to
|
||
// the request thread to do it. This is why AsynReq_Cancel is called!!!
|
||
|
||
// Redirect the call to the pending op queue object
|
||
//
|
||
if (g_pRespQueue != NULL)
|
||
{
|
||
hr = g_pRespQueue->Cancel (uRespID);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_RegisterClient
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_RegisterClient (
|
||
DWORD_PTR dwContext,
|
||
SERVER_INFO *pServer,
|
||
LDAP_CLIENTINFO *pInfo,
|
||
HANDLE *phClient,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Maks sure the server name is valid
|
||
//
|
||
if (MyIsBadServerInfo (pServer))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the returned handle
|
||
//
|
||
if (phClient == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the client info structure is valid
|
||
//
|
||
#ifdef STRICT_CHECK
|
||
if (MyIsBadWritePtr (pInfo, sizeof (*pInfo)))
|
||
return ILS_E_POINTER;
|
||
#endif
|
||
|
||
// Make sure the unique id is valid
|
||
//
|
||
TCHAR *pszCN = (TCHAR *) ((BYTE *) pInfo + pInfo->uOffsetCN);
|
||
if (pInfo->uOffsetCN == INVALID_OFFSET || *pszCN == TEXT ('\0'))
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Make sure no modify/remove extended attributes
|
||
// Registration only allows ToAdd
|
||
//
|
||
if (pInfo->cAttrsToModify != 0 || pInfo->cAttrsToRemove != 0)
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cParams = 3;
|
||
ULONG cbSize = cbServer + pInfo->uSize;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_REGISTER_CLIENT, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Create a local client object
|
||
//
|
||
HRESULT hr;
|
||
SP_CClient *pClient = new SP_CClient (dwContext);
|
||
if (pClient == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Make sure this client object will not go away unexpectedly
|
||
//
|
||
pClient->AddRef ();
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pInfo, pInfo->uSize);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD_PTR) pClient, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
MyExit:
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
*phClient = (HANDLE) pClient;
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_RegisterClient ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_REGISTER_CLIENT);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
LDAP_CLIENTINFO *pInfo = (LDAP_CLIENTINFO *) MarshalReq_GetParam (pReq, 1);
|
||
SP_CClient *pClient = (SP_CClient *) MarshalReq_GetParam (pReq, 2);
|
||
|
||
// Register the client object on the server
|
||
//
|
||
HRESULT hr = pClient->Register (pReq->uRespID, pServer, pInfo);
|
||
if (hr != S_OK)
|
||
{
|
||
// Release this newly allocated local user object
|
||
//
|
||
pClient->Release ();
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_RegisterProtocol
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Blocked by ILS (7438, 7442)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_RegisterProtocol (
|
||
HANDLE hClient,
|
||
LDAP_PROTINFO *pInfo,
|
||
HANDLE *phProt,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CClient *pClient = (SP_CClient *) hClient;
|
||
|
||
// Make sure the parent local app object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pClient, sizeof (*pClient)) ||
|
||
! pClient->IsValidObject () ||
|
||
! pClient->IsRegistered ())
|
||
return ILS_E_HANDLE;
|
||
|
||
// Make sure the returned handle
|
||
//
|
||
if (phProt == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the prot info structure is valid
|
||
//
|
||
#ifdef STRICT_CHECK
|
||
if (MyIsBadWritePtr (pInfo, sizeof (*pInfo)))
|
||
return ILS_E_POINTER;
|
||
#endif
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the protocol name is valid
|
||
//
|
||
TCHAR *pszProtName = (TCHAR *) ((BYTE *) pInfo + pInfo->uOffsetName);
|
||
if (pInfo->uOffsetName == INVALID_OFFSET || *pszProtName == TEXT ('\0'))
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cParams = 3;
|
||
ULONG cbSize = pInfo->uSize;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_REGISTER_PROTOCOL, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Create a local prot object
|
||
//
|
||
SP_CProtocol *pProt = new SP_CProtocol (pClient);
|
||
if (pProt == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Make sure the local prot object will not be deleted randomly
|
||
//
|
||
pProt->AddRef ();
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParam (pReq, 0, (DWORD_PTR) pClient, 0);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pInfo, pInfo->uSize);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD_PTR) pProt, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
MyExit:
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
*phProt = (HANDLE) pProt;
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_RegisterProtocol ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_REGISTER_PROTOCOL);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SP_CClient *pClient = (SP_CClient *) MarshalReq_GetParam (pReq, 0);
|
||
LDAP_PROTINFO *pInfo = (LDAP_PROTINFO *) MarshalReq_GetParam (pReq, 1);
|
||
SP_CProtocol *pProt = (SP_CProtocol *) MarshalReq_GetParam (pReq, 2);
|
||
|
||
// Make sure the parent local app object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pClient, sizeof (*pClient)) ||
|
||
! pClient->IsValidObject () ||
|
||
! pClient->IsRegistered ())
|
||
{
|
||
hr = ILS_E_HANDLE;
|
||
}
|
||
else
|
||
{
|
||
// Make the local prot object do prot registration
|
||
//
|
||
hr = pProt->Register (pReq->uRespID, pInfo);
|
||
if (hr != S_OK)
|
||
{
|
||
// Release the newly allocated local prot object
|
||
//
|
||
pProt->Release ();
|
||
}
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_RegisterMeeting
|
||
|
||
Input:
|
||
pszServer: A pointer to the server name.
|
||
pMeetInfo: A pointer to meeting info structure.
|
||
phMtg: A return meeting object handle.
|
||
pAsyncInfo: A pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT
|
||
UlsLdap_RegisterMeeting (
|
||
DWORD dwContext,
|
||
SERVER_INFO *pServer,
|
||
LDAP_MEETINFO *pInfo,
|
||
HANDLE *phMtg,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Maks sure the server name is valid
|
||
//
|
||
if (MyIsBadServerInfo (pServer))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the returned handle
|
||
//
|
||
if (phMtg == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the user info structure is valid
|
||
//
|
||
#ifdef STRICT_CHECK
|
||
if (MyIsBadWritePtr (pInfo, sizeof (*pInfo)))
|
||
return ILS_E_POINTER;
|
||
#endif
|
||
|
||
// Make sure the unique id is valid
|
||
//
|
||
TCHAR *pszName = (TCHAR *) ((BYTE *) pInfo + pInfo->uOffsetMeetingPlaceID);
|
||
if (pInfo->uOffsetMeetingPlaceID == INVALID_OFFSET || *pszName == TEXT ('\0'))
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Make sure no modify/remove extended attributes
|
||
// Registration only allows ToAdd
|
||
//
|
||
if (pInfo->cAttrsToModify != 0 || pInfo->cAttrsToRemove != 0)
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cParams = 3;
|
||
ULONG cbSize = cbServer + pInfo->uSize;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_REGISTER_MEETING, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Create a local user object
|
||
//
|
||
SP_CMeeting *pMtg = new SP_CMeeting (dwContext);
|
||
if (pMtg == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Make sure this local user object will not go away randomly
|
||
//
|
||
pMtg->AddRef ();
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD) pInfo, pInfo->uSize);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) pMtg, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
MyExit:
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
*phMtg = (HANDLE) pMtg;
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_RegisterMeeting ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_REGISTER_MEETING);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
LDAP_MEETINFO *pInfo = (LDAP_MEETINFO *) MarshalReq_GetParam (pReq, 1);
|
||
SP_CMeeting *pMtg = (SP_CMeeting *) MarshalReq_GetParam (pReq, 2);
|
||
|
||
// Make the local meeting object do meeting registration
|
||
//
|
||
HRESULT hr = pMtg->Register (pReq->uRespID, pServer, pInfo);
|
||
if (hr != S_OK)
|
||
{
|
||
// Release this newly allocated local user object
|
||
//
|
||
pMtg->Release ();
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_UnRegisterClient
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_UnRegisterClient (
|
||
HANDLE hClient,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CClient *pClient = (SP_CClient *) hClient;
|
||
|
||
// Make sure the local client object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pClient, sizeof (*pClient)) ||
|
||
! pClient->IsValidObject () ||
|
||
! pClient->IsRegistered ())
|
||
return ILS_E_HANDLE;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cParams = 1;
|
||
ULONG cbSize = 0;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_UNREGISTER_CLIENT, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParam (pReq, 0, (DWORD_PTR) pClient, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_UnRegisterClient ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_UNREGISTER_CLIENT);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SP_CClient *pClient = (SP_CClient *) MarshalReq_GetParam (pReq, 0);
|
||
|
||
// Make sure the local client object is valid
|
||
//
|
||
HRESULT hr;
|
||
if (MyIsBadWritePtr (pClient, sizeof (*pClient)) ||
|
||
! pClient->IsValidObject () ||
|
||
! pClient->IsRegistered ())
|
||
{
|
||
// When submitting this request, the client object is fine
|
||
// but now it is not, so it must have been unregistered and released.
|
||
//
|
||
MyAssert (FALSE); // to see if any one tries to break it this way!!!
|
||
hr = S_OK;
|
||
}
|
||
else
|
||
{
|
||
// Make the client object do user unregistration
|
||
//
|
||
hr = pClient->UnRegister (pReq->uRespID);
|
||
|
||
// Free this client object
|
||
//
|
||
pClient->Release ();
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_UnRegisterProtocol
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT UlsLdap_VirtualUnRegisterProtocol ( HANDLE hProt )
|
||
{
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CProtocol *pProt = (SP_CProtocol *) hProt;
|
||
|
||
// Make sure the local prot object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pProt, sizeof (*pProt)))
|
||
return ILS_E_HANDLE;
|
||
|
||
// Free this local prot object
|
||
//
|
||
pProt->Release ();
|
||
|
||
return S_OK;
|
||
}
|
||
|
||
HRESULT UlsLdap_UnRegisterProtocol (
|
||
HANDLE hProt,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CProtocol *pProt = (SP_CProtocol *) hProt;
|
||
|
||
// Make sure the local prot object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pProt, sizeof (*pProt)) ||
|
||
! pProt->IsValidObject () ||
|
||
! pProt->IsRegistered ())
|
||
return ILS_E_HANDLE;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cParams = 1;
|
||
ULONG cbSize = 0;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_UNREGISTER_PROTOCOL, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParam (pReq, 0, (DWORD_PTR) pProt, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_UnRegisterProt ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_UNREGISTER_PROTOCOL);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SP_CProtocol *pProt = (SP_CProtocol *) MarshalReq_GetParam (pReq, 0);
|
||
|
||
// Make sure the local prot object is valid
|
||
//
|
||
HRESULT hr;
|
||
if (MyIsBadWritePtr (pProt, sizeof (*pProt)) ||
|
||
! pProt->IsValidObject () ||
|
||
! pProt->IsRegistered ())
|
||
{
|
||
// When submitting this request, the client object is fine
|
||
// but now it is not, so it must have been unregistered and released.
|
||
//
|
||
MyAssert (FALSE); // to see if any one tries to break it this way!!!
|
||
hr = S_OK;
|
||
}
|
||
else
|
||
{
|
||
// Make the local prot object do prot unregistration
|
||
//
|
||
hr = pProt->UnRegister (pReq->uRespID);
|
||
|
||
// Free this local prot object
|
||
//
|
||
pProt->Release ();
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_UnRegisterMeeting
|
||
|
||
Input:
|
||
pszServer: server name.
|
||
hMeeting: a handle to the meeting object.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT UlsLdap_UnRegisterMeeting (
|
||
HANDLE hMtg,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CMeeting *pMtg = (SP_CMeeting *) hMtg;
|
||
|
||
// Make sure the local user object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pMtg, sizeof (*pMtg)) ||
|
||
! pMtg->IsValidObject () ||
|
||
! pMtg->IsRegistered ())
|
||
return ILS_E_HANDLE;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cParams = 1;
|
||
ULONG cbSize = 0;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_UNREGISTER_MEETING, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParam (pReq, 0, (DWORD) pMtg, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_UnRegisterMeeting ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_UNREGISTER_MEETING);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SP_CMeeting *pMtg = (SP_CMeeting *) MarshalReq_GetParam (pReq, 0);
|
||
|
||
// Make sure the local user object is valid
|
||
//
|
||
HRESULT hr;
|
||
if (MyIsBadWritePtr (pMtg, sizeof (*pMtg)) ||
|
||
! pMtg->IsValidObject () ||
|
||
! pMtg->IsRegistered ())
|
||
{
|
||
// When submitting this request, the client object is fine
|
||
// but now it is not, so it must have been unregistered and released.
|
||
//
|
||
MyAssert (FALSE); // to see if any one tries to break it this way!!!
|
||
hr = S_OK;
|
||
}
|
||
else
|
||
{
|
||
// Make the local user object do user unregistration
|
||
//
|
||
hr = pMtg->UnRegister (pReq->uRespID);
|
||
|
||
// Free this local user object
|
||
//
|
||
pMtg->Release ();
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_SetClientInfo
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_SetClientInfo (
|
||
HANDLE hClient,
|
||
LDAP_CLIENTINFO *pInfo,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CClient *pClient = (SP_CClient *) hClient;
|
||
|
||
// Make sure the client object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pClient, sizeof (*pClient)) ||
|
||
! pClient->IsValidObject () ||
|
||
! pClient->IsRegistered ())
|
||
return ILS_E_HANDLE;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the user info structure is valid
|
||
//
|
||
#ifdef STRICT_CHECK
|
||
if (MyIsBadWritePtr (pInfo, sizeof (*pInfo)))
|
||
return ILS_E_POINTER;
|
||
#endif
|
||
|
||
// We should not change the app name here
|
||
//
|
||
if (pInfo->uOffsetAppName != INVALID_OFFSET || pInfo->uOffsetCN != INVALID_OFFSET)
|
||
return ILS_E_PARAMETER; // ILS_E_READ_ONLY;
|
||
|
||
// lonchanc: BUGS
|
||
// ISBU requires us to block any change of components of dn
|
||
//
|
||
pInfo->uOffsetCountryName = 0;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cParams = 2;
|
||
ULONG cbSize = pInfo->uSize;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_SET_CLIENT_INFO, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParam (pReq, 0, (DWORD_PTR) pClient, 0);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pInfo, pInfo->uSize);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_SetClientInfo ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_SET_CLIENT_INFO);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SP_CClient *pClient = (SP_CClient *) MarshalReq_GetParam (pReq, 0);
|
||
LDAP_CLIENTINFO *pInfo = (LDAP_CLIENTINFO *) MarshalReq_GetParam (pReq, 1);
|
||
|
||
// Make sure the local client object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pClient, sizeof (*pClient)) ||
|
||
! pClient->IsValidObject () ||
|
||
! pClient->IsRegistered ())
|
||
{
|
||
// When submitting this request, the client object is fine
|
||
// but now it is not, so it must have been unregistered and released.
|
||
//
|
||
MyAssert (FALSE); // to see if any one tries to break it this way!!!
|
||
hr = ILS_E_HANDLE;
|
||
}
|
||
else
|
||
{
|
||
// Set standard attributes
|
||
//
|
||
hr = pClient->SetAttributes (pReq->uRespID, pInfo);
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_SetProtocolInfo
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Blocked by ILS (7438, 7442)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT UlsLdap_SetProtocolInfo (
|
||
HANDLE hProt,
|
||
LDAP_PROTINFO *pInfo,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Convert handle to pointer
|
||
//
|
||
SP_CProtocol *pProt = (SP_CProtocol *) hProt;
|
||
|
||
// Make sure the local prot object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pProt, sizeof (*pProt)) ||
|
||
! pProt->IsValidObject () ||
|
||
! pProt->IsRegistered ())
|
||
return ILS_E_HANDLE;
|
||
|
||
// Make sure the prot info structure is valid
|
||
//
|
||
#ifdef STRICT_CHECK
|
||
if (MyIsBadWritePtr (pInfo, sizeof (*pInfo)))
|
||
return ILS_E_POINTER;
|
||
#endif
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cParams = 2;
|
||
ULONG cbSize = pInfo->uSize;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_SET_PROTOCOL_INFO, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParam (pReq, 0, (DWORD_PTR) pProt, 0);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pInfo, pInfo->uSize);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_SetProtocolInfo ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_SET_PROTOCOL_INFO);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SP_CProtocol *pProt = (SP_CProtocol *) MarshalReq_GetParam (pReq, 0);
|
||
LDAP_PROTINFO *pInfo = (LDAP_PROTINFO *) MarshalReq_GetParam (pReq, 1);
|
||
|
||
// Make sure the local client object is valid
|
||
//
|
||
if (MyIsBadWritePtr (pProt, sizeof (*pProt)) ||
|
||
! pProt->IsValidObject () ||
|
||
! pProt->IsRegistered ())
|
||
{
|
||
// When submitting this request, the client object is fine
|
||
// but now it is not, so it must have been unregistered and released.
|
||
//
|
||
MyAssert (FALSE); // to see if any one tries to break it this way!!!
|
||
hr = ILS_E_HANDLE;
|
||
}
|
||
else
|
||
{
|
||
// Set standard attributes
|
||
//
|
||
hr = pProt->SetAttributes (pReq->uRespID, pInfo);
|
||
}
|
||
|
||
return (LPARAM) hr;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_SetMeetingInfo
|
||
|
||
Input:
|
||
pszServer: A server name.
|
||
pszMtgName: A meeting id string.
|
||
pMeetInfo: A pointer to meeting info structure.
|
||
pAsyncInfo: A pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT UlsLdap_SetMeetingInfo (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszMtgName,
|
||
LDAP_MEETINFO *pInfo,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Make sure we have valid pointers
|
||
//
|
||
if (MyIsBadServerInfo (pServer) || MyIsBadString (pszMtgName))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the app info structure is valid
|
||
//
|
||
#ifdef STRICT_CHECK
|
||
if (MyIsBadWritePtr (pInfo, sizeof (*pInfo)))
|
||
return ILS_E_POINTER;
|
||
#endif
|
||
|
||
// Make sure we do not change meeting name
|
||
//
|
||
if (pInfo->uOffsetMeetingPlaceID != 0)
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeMtgName = (lstrlen (pszMtgName) + 1) * sizeof (TCHAR);
|
||
ULONG cParams = 3;
|
||
ULONG cbSize = cbServer + cbSizeMtgName + pInfo->uSize;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_SET_MEETING_INFO, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD) pszMtgName, cbSizeMtgName);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) pInfo, pInfo->uSize);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_SetMeetingInfo ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_SET_MEETING_INFO);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszMtgName = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
LDAP_MEETINFO *pInfo = (LDAP_MEETINFO *) MarshalReq_GetParam (pReq, 2);
|
||
|
||
MyAssert (! MyIsBadServerInfo (pServer));
|
||
MyAssert (MyIsGoodString (pszMtgName));
|
||
MyAssert (! MyIsBadWritePtr (pInfo, pInfo->uSize));
|
||
|
||
// Set standard/arbitrary attributes
|
||
//
|
||
return (LPARAM) MtgSetAttrs (pServer, pszMtgName, pInfo, pReq->uRespID);
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
My_EnumClientsEx
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
My_EnumClientsEx (
|
||
ULONG uNotifyMsg,
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure we only deal with the following messages
|
||
//
|
||
MyAssert ( uNotifyMsg == WM_ILS_ENUM_CLIENTINFOS ||
|
||
uNotifyMsg == WM_ILS_ENUM_CLIENTS);
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Maks sure the server name is valid
|
||
//
|
||
if (MyIsBadServerInfo (pServer))
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeAnyAttrNames = 0;
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
ULONG cch;
|
||
for (ULONG i = 0; i < cAnyAttrNames; i++)
|
||
{
|
||
cch = lstrlen (psz) + 1;
|
||
cbSizeAnyAttrNames += cch * sizeof (TCHAR);
|
||
psz += cch;
|
||
}
|
||
ULONG cbSizeFilter = (pszFilter != NULL) ? (lstrlen (pszFilter) + 1) * sizeof (TCHAR) : 0;
|
||
ULONG cParams = 4;
|
||
ULONG cbSize = cbServer + cbSizeAnyAttrNames + cbSizeFilter;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (uNotifyMsg, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pszAnyAttrNameList, cbSizeAnyAttrNames);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) cAnyAttrNames, 0);
|
||
MarshalReq_SetParam (pReq, 3, (DWORD_PTR) pszFilter, cbSizeFilter);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_EnumClientsEx ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
ULONG uNotifyMsg = pReq->uNotifyMsg;
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszAnyAttrNameList = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
ULONG cAnyAttrNames = (ULONG) MarshalReq_GetParam (pReq, 2);
|
||
TCHAR *pszFilter = (TCHAR *) MarshalReq_GetParam (pReq, 3);
|
||
|
||
// Clean locals
|
||
//
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[COUNT_ENUM_DIR_CLIENT_INFO+1];
|
||
TCHAR **ppszNameList = &apszAttrNames[0];
|
||
ULONG cTotalNames;
|
||
|
||
// See the input filter string
|
||
//
|
||
if (pszFilter != NULL)
|
||
{
|
||
MyDebugMsg ((ZONE_FILTER, "EC: in-filter=[%s]\r\n", pszFilter));
|
||
}
|
||
|
||
// Create a enum client filter
|
||
//
|
||
pszFilter = AddBaseToFilter (pszFilter, STR_DEF_CLIENT_BASE_DN);
|
||
if (pszFilter == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// See the enhanced filter string
|
||
//
|
||
if (pszFilter != NULL)
|
||
{
|
||
MyDebugMsg ((ZONE_FILTER, "EC: out-filter=[%s]\r\n", pszFilter));
|
||
}
|
||
|
||
// Ask directory standard attributes only if enum client info
|
||
//
|
||
if (uNotifyMsg == WM_ILS_ENUM_CLIENTINFOS)
|
||
{
|
||
// Default total number of attributes
|
||
//
|
||
cTotalNames = COUNT_ENUM_DIR_CLIENT_INFO;
|
||
|
||
// Do we want any extended attribute to be returned?
|
||
//
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
{
|
||
// Prefix arbitrary attribute names
|
||
//
|
||
pszAnyAttrNameList = IlsPrefixNameValueArray (FALSE, cAnyAttrNames,
|
||
(const TCHAR *) pszAnyAttrNameList);
|
||
if (pszAnyAttrNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Allocate memory for returned attributes' names
|
||
//
|
||
cTotalNames += cAnyAttrNames;
|
||
ppszNameList = (TCHAR **) MemAlloc (sizeof (TCHAR *) * (cTotalNames + 1));
|
||
if (ppszNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
MemFree (pszAnyAttrNameList);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
cTotalNames = 1;
|
||
}
|
||
|
||
// Ask to return cn only if enum names only
|
||
//
|
||
ppszNameList[0] = STR_CLIENT_CN;
|
||
|
||
// Add names of standard/extended attributes to return
|
||
//
|
||
if (uNotifyMsg == WM_ILS_ENUM_CLIENTINFOS)
|
||
{
|
||
// Set up standard attribtues now
|
||
//
|
||
for (ULONG i = 1; i < COUNT_ENUM_DIR_CLIENT_INFO; i++)
|
||
{
|
||
ppszNameList[i] = (TCHAR *) c_apszClientStdAttrNames[i];
|
||
}
|
||
|
||
// Set arbitrary attribute names if needed
|
||
//
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
for (i = COUNT_ENUM_DIR_CLIENT_INFO; i < cTotalNames; i++)
|
||
{
|
||
ppszNameList[i] = psz;
|
||
psz += lstrlen (psz) + 1;
|
||
}
|
||
}
|
||
|
||
// Terminate the list
|
||
//
|
||
ppszNameList[cTotalNames] = NULL;
|
||
|
||
// Get a session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr == S_OK)
|
||
{
|
||
// Get an ldap session
|
||
//
|
||
MyAssert (pSession != NULL);
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send search query
|
||
//
|
||
uMsgID = ldap_search ( ld,
|
||
STR_DEF_CLIENT_BASE_DN, // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter, // filter
|
||
ppszNameList, // attrs[]
|
||
0); // both type and value
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
}
|
||
}
|
||
|
||
// Free the filter string
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Free the buffer holding all returned attribute names if needed
|
||
//
|
||
if (ppszNameList != &apszAttrNames[0])
|
||
MemFree (ppszNameList);
|
||
|
||
// Report failure if so
|
||
//
|
||
if (hr != S_OK)
|
||
{
|
||
// Free extended attribute name list
|
||
//
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
MemFree (pszAnyAttrNameList);
|
||
|
||
// Report failure
|
||
//
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = uNotifyMsg;
|
||
ri.cAnyAttrs = cAnyAttrNames;
|
||
ri.pszAnyAttrNameList = pszAnyAttrNameList;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_ENUM *pEnum = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
pEnum = (LDAP_ENUM *) MemAlloc (sizeof (LDAP_ENUM));
|
||
if (pEnum != NULL)
|
||
{
|
||
pEnum->uSize = sizeof (*pEnum);
|
||
pEnum->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) pEnum;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_EnumClients
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_EnumClients (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
// Dispatch the call to a common subroutine
|
||
//
|
||
return My_EnumClientsEx (WM_ILS_ENUM_CLIENTS,
|
||
pServer,
|
||
NULL,
|
||
0,
|
||
pszFilter,
|
||
pAsyncInfo);
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_EnumClientInfos
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_EnumClientInfos (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
// Dispatch the call to a common subroutine
|
||
//
|
||
return My_EnumClientsEx (WM_ILS_ENUM_CLIENTINFOS,
|
||
pServer,
|
||
pszAnyAttrNameList,
|
||
cAnyAttrNames,
|
||
pszFilter,
|
||
pAsyncInfo);
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_EnumProtocols
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Blocked by ILS (7438, 7442)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_EnumProtocols (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszUserName,
|
||
TCHAR *pszAppName,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
if (MyIsBadServerInfo (pServer) || MyIsBadString (pszUserName) ||
|
||
MyIsBadString (pszAppName))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeUserName = (lstrlen (pszUserName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeAppName = (lstrlen (pszAppName) + 1) * sizeof (TCHAR);
|
||
ULONG cParams = 3;
|
||
ULONG cbSize = cbServer + cbSizeUserName + cbSizeAppName;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_ENUM_PROTOCOLS, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pszUserName, cbSizeUserName);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD_PTR) pszAppName, cbSizeAppName);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_EnumProtocols ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_ENUM_PROTOCOLS);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszUserName = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
TCHAR *pszAppName = (TCHAR *) MarshalReq_GetParam (pReq, 2);
|
||
|
||
// Create enum protocols filter
|
||
//
|
||
TCHAR *pszFilter = ProtCreateEnumFilter (pszUserName, pszAppName);
|
||
if (pszFilter == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Get the session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr != S_OK)
|
||
{
|
||
MemFree (pszFilter);
|
||
goto MyExit;
|
||
}
|
||
MyAssert (pSession != NULL);
|
||
|
||
// Get an ldap session
|
||
//
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[2];
|
||
apszAttrNames[0] = (TCHAR *) c_apszProtStdAttrNames[ENUM_PROTATTR_NAME];
|
||
apszAttrNames[1] = NULL;
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send the search query
|
||
//
|
||
uMsgID = ldap_search (ld, (TCHAR *) &c_szDefClientBaseDN[0], // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter,
|
||
&apszAttrNames[0], // attrs[]
|
||
0); // both type and value
|
||
// Free the search filter
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Check the return of ldap_search
|
||
//
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = WM_ILS_ENUM_PROTOCOLS;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_ENUM *pEnum = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
pEnum = (LDAP_ENUM *) MemAlloc (sizeof (LDAP_ENUM));
|
||
if (pEnum != NULL)
|
||
{
|
||
pEnum->uSize = sizeof (*pEnum);
|
||
pEnum->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) pEnum;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
My_EnumMtgsEx
|
||
|
||
Input:
|
||
uNotifyMsg: A notification message.
|
||
pszServer: A pointer to the server name.
|
||
pszFilter: A pointer to a filter string.
|
||
pAsyncInfo: A pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT
|
||
My_EnumMtgsEx (
|
||
ULONG uNotifyMsg,
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure we only deal with the following messages
|
||
//
|
||
MyAssert ( uNotifyMsg == WM_ILS_ENUM_MEETINGINFOS ||
|
||
uNotifyMsg == WM_ILS_ENUM_MEETINGS);
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Maks sure the server name is valid
|
||
//
|
||
if (MyIsBadServerInfo (pServer))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeAnyAttrNames = 0;
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
ULONG cch;
|
||
for (ULONG i = 0; i < cAnyAttrNames; i++)
|
||
{
|
||
cch = lstrlen (psz) + 1;
|
||
cbSizeAnyAttrNames += cch * sizeof (TCHAR);
|
||
psz += cch;
|
||
}
|
||
ULONG cbSizeFilter = (pszFilter != NULL) ? (lstrlen (pszFilter) + 1) * sizeof (TCHAR) : 0;
|
||
ULONG cParams = 4;
|
||
ULONG cbSize = cbServer + cbSizeAnyAttrNames + cbSizeFilter;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (uNotifyMsg, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD) pszAnyAttrNameList, cbSizeAnyAttrNames);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) cAnyAttrNames, 0);
|
||
MarshalReq_SetParam (pReq, 3, (DWORD) pszFilter, cbSizeFilter);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_EnumMtgsEx ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
ULONG uNotifyMsg = pReq->uNotifyMsg;
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszAnyAttrNameList = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
ULONG cAnyAttrNames = (ULONG) MarshalReq_GetParam (pReq, 2);
|
||
TCHAR *pszFilter = (TCHAR *) MarshalReq_GetParam (pReq, 3);
|
||
|
||
// Clean locals
|
||
//
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[COUNT_ENUM_DIRMTGINFO+1];
|
||
TCHAR **ppszNameList = &apszAttrNames[0];
|
||
ULONG cTotalNames;
|
||
|
||
// See the input filter string
|
||
//
|
||
if (pszFilter != NULL)
|
||
{
|
||
MyDebugMsg ((ZONE_FILTER, "EU: in-filter=[%s]\r\n", pszFilter));
|
||
}
|
||
|
||
// Create a enum user filter
|
||
//
|
||
pszFilter = AddBaseToFilter (pszFilter, &c_szDefMtgBaseDN[0]);
|
||
if (pszFilter == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// See the enhanced filter string
|
||
//
|
||
if (pszFilter != NULL)
|
||
{
|
||
MyDebugMsg ((ZONE_FILTER, "EU: out-filter=[%s]\r\n", pszFilter));
|
||
}
|
||
|
||
// Ask directory standard attributes only if enum dir user info
|
||
//
|
||
if (uNotifyMsg == WM_ILS_ENUM_MEETINGINFOS)
|
||
{
|
||
// Default total number of attributes
|
||
//
|
||
cTotalNames = COUNT_ENUM_DIRMTGINFO;
|
||
|
||
// Do we want any extended attribute to be returned?
|
||
//
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
{
|
||
// Prefix arbitrary attribute names
|
||
//
|
||
pszAnyAttrNameList = IlsPrefixNameValueArray (FALSE, cAnyAttrNames,
|
||
(const TCHAR *) pszAnyAttrNameList);
|
||
if (pszAnyAttrNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Allocate memory for returned attributes' names
|
||
//
|
||
cTotalNames += cAnyAttrNames;
|
||
ppszNameList = (TCHAR **) MemAlloc (sizeof (TCHAR *) * (cTotalNames + 1));
|
||
if (ppszNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
MemFree (pszAnyAttrNameList);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
cTotalNames = 1;
|
||
}
|
||
|
||
// Ask to return cn only if enum names only
|
||
//
|
||
ppszNameList[0] = STR_MTG_NAME;
|
||
|
||
// Add names of standard/extended attributes to return
|
||
//
|
||
if (uNotifyMsg == WM_ILS_ENUM_MEETINGINFOS)
|
||
{
|
||
// Set up standard attribtues now
|
||
//
|
||
for (ULONG i = 1; i < COUNT_ENUM_DIRMTGINFO; i++)
|
||
{
|
||
ppszNameList[i] = (TCHAR *) c_apszMtgStdAttrNames[i];
|
||
}
|
||
|
||
// Set arbitrary attribute names if needed
|
||
//
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
for (i = COUNT_ENUM_DIRMTGINFO; i < cTotalNames; i++)
|
||
{
|
||
ppszNameList[i] = psz;
|
||
psz += lstrlen (psz) + 1;
|
||
}
|
||
}
|
||
|
||
// Terminate the list
|
||
//
|
||
ppszNameList[cTotalNames] = NULL;
|
||
|
||
// Get a session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr == S_OK)
|
||
{
|
||
// Get an ldap session
|
||
//
|
||
MyAssert (pSession != NULL);
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send search query
|
||
//
|
||
uMsgID = ldap_search (ld, (TCHAR *) &c_szDefMtgBaseDN[0], // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter, // filter
|
||
ppszNameList, // attrs[]
|
||
0); // both type and value
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
}
|
||
}
|
||
|
||
// Free the filter string
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Free the buffer holding all returned attribute names if needed
|
||
//
|
||
if (ppszNameList != &apszAttrNames[0])
|
||
MemFree (ppszNameList);
|
||
|
||
// Report failure if so
|
||
//
|
||
if (hr != S_OK)
|
||
{
|
||
// Free extended attribute name list
|
||
//
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
MemFree (pszAnyAttrNameList);
|
||
|
||
// Report failure
|
||
//
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = uNotifyMsg;
|
||
ri.cAnyAttrs = cAnyAttrNames;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_ENUM *pEnum = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
pEnum = (LDAP_ENUM *) MemAlloc (sizeof (LDAP_ENUM));
|
||
if (pEnum != NULL)
|
||
{
|
||
pEnum->uSize = sizeof (*pEnum);
|
||
pEnum->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) pEnum;
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_EnumMeetingInfos
|
||
|
||
Input:
|
||
pszServer: server name.
|
||
pszFilter: a filter string.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT
|
||
UlsLdap_EnumMeetingInfos (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
// Dispatch the call to a common subroutine
|
||
//
|
||
return My_EnumMtgsEx (WM_ILS_ENUM_MEETINGINFOS,
|
||
pServer,
|
||
pszAnyAttrNameList,
|
||
cAnyAttrNames,
|
||
pszFilter,
|
||
pAsyncInfo);
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_EnumMeetings
|
||
|
||
Input:
|
||
pszServer: server name.
|
||
pszFilter: a filter string.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT
|
||
UlsLdap_EnumMeetings (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Dispatch the call to a common subroutine
|
||
//
|
||
return My_EnumMtgsEx (WM_ILS_ENUM_MEETINGS,
|
||
pServer,
|
||
NULL,
|
||
0,
|
||
pszFilter,
|
||
pAsyncInfo);
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_EnumAttendee
|
||
|
||
Input:
|
||
pszServer: server name.
|
||
pszMeetingID: a meeting id string.
|
||
pszFilter: a filter string.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT
|
||
UlsLdap_EnumAttendees(
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszMtgName,
|
||
TCHAR *pszFilter,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
if (MyIsBadServerInfo (pServer) || MyIsBadString (pszMtgName))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeMtgName = (lstrlen (pszMtgName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeFilter = (pszFilter != NULL) ? (lstrlen (pszFilter) + 1) * sizeof (TCHAR) : 0;
|
||
ULONG cParams = 3;
|
||
ULONG cbSize = cbServer + cbSizeMtgName + cbSizeFilter;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_ENUM_ATTENDEES, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD) pszMtgName, cbSizeMtgName);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) pszFilter, cbSizeFilter);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_EnumAttendees ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_ENUM_ATTENDEES);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszMtgName = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
TCHAR *pszFilter = (TCHAR *) MarshalReq_GetParam (pReq, 2);
|
||
|
||
// Clean up locals
|
||
//
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
// BUGS: ignore the input filter
|
||
//
|
||
pszFilter = MtgCreateEnumMembersFilter (pszMtgName);
|
||
if (pszFilter == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[3];
|
||
apszAttrNames[0] = STR_MTG_NAME;
|
||
apszAttrNames[1] = (TCHAR *) c_apszMtgStdAttrNames[ENUM_MTGATTR_MEMBERS];
|
||
apszAttrNames[2] = NULL;
|
||
|
||
// Get the session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr != S_OK)
|
||
{
|
||
MemFree (pszFilter);
|
||
goto MyExit;
|
||
}
|
||
MyAssert (pSession != NULL);
|
||
|
||
// Get an ldap session
|
||
//
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send the search query
|
||
//
|
||
uMsgID = ldap_search (ld, (TCHAR *) &c_szDefMtgBaseDN[0], // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter,
|
||
&apszAttrNames[0], // attrs[]
|
||
0); // both type and value
|
||
|
||
// Free the search filter
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Check the return of ldap_search
|
||
//
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = WM_ILS_ENUM_ATTENDEES;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_ENUM *pEnum = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
pEnum = (LDAP_ENUM *) MemAlloc (sizeof (LDAP_ENUM));
|
||
if (pEnum != NULL)
|
||
{
|
||
pEnum->uSize = sizeof (*pEnum);
|
||
pEnum->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) pEnum;
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_ResolveClient
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Tested on ILS (7438)
|
||
1/14/97 Chu, Lon-Chan [lonchanc]
|
||
Collapsed user/app objects.
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT
|
||
UlsLdap_ResolveClient (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszCN,
|
||
TCHAR *pszAppName,
|
||
TCHAR *pszProtName,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Maks sure the server name is valid
|
||
//
|
||
if (MyIsBadServerInfo (pServer))
|
||
return ILS_E_POINTER;
|
||
|
||
// Maks sure the user name is valid
|
||
//
|
||
if (MyIsBadString (pszCN))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeCN = (lstrlen (pszCN) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeAppName = (pszAppName != NULL) ? (lstrlen (pszAppName) + 1) * sizeof (TCHAR) : 0;
|
||
ULONG cbSizeProtName = (pszProtName != NULL) ? (lstrlen (pszProtName) + 1) * sizeof (TCHAR) : 0;
|
||
ULONG cbSizeAnyAttrNames = 0;
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
ULONG cch;
|
||
for (ULONG i = 0; i < cAnyAttrNames; i++)
|
||
{
|
||
cch = lstrlen (psz) + 1;
|
||
cbSizeAnyAttrNames += cch * sizeof (TCHAR);
|
||
psz += cch;
|
||
}
|
||
ULONG cParams = 6;
|
||
ULONG cbSize = cbServer + cbSizeCN + cbSizeAppName + cbSizeProtName + cbSizeAnyAttrNames;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_RESOLVE_CLIENT, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pszCN, cbSizeCN);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD_PTR) pszAppName, cbSizeAppName);
|
||
MarshalReq_SetParam (pReq, 3, (DWORD_PTR) pszProtName, cbSizeProtName);
|
||
MarshalReq_SetParam (pReq, 4, (DWORD_PTR) pszAnyAttrNameList, cbSizeAnyAttrNames);
|
||
MarshalReq_SetParam (pReq, 5, (DWORD) cAnyAttrNames, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_ResolveClient ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_RESOLVE_CLIENT);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszCN = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
TCHAR *pszAppName = (TCHAR *) MarshalReq_GetParam (pReq, 2);
|
||
TCHAR *pszProtName = (TCHAR *) MarshalReq_GetParam (pReq, 3);
|
||
TCHAR *pszAnyAttrNameList = (TCHAR *) MarshalReq_GetParam (pReq, 4);
|
||
ULONG cAnyAttrNames = (ULONG) MarshalReq_GetParam (pReq, 5);
|
||
|
||
// Create a resolve client filter
|
||
//
|
||
TCHAR *pszFilter = ClntCreateResolveFilter (pszCN, pszAppName, pszProtName);
|
||
if (pszFilter == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[COUNT_ENUM_RES_CLIENT_INFO+1];
|
||
TCHAR **ppszNameList;
|
||
ppszNameList = &apszAttrNames[0];
|
||
ULONG cTotalNames;
|
||
cTotalNames = COUNT_ENUM_RES_CLIENT_INFO;
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
{
|
||
// Prefix arbitrary attribute names
|
||
//
|
||
pszAnyAttrNameList = IlsPrefixNameValueArray (FALSE, cAnyAttrNames,
|
||
(const TCHAR *) pszAnyAttrNameList);
|
||
if (pszAnyAttrNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// NOTE that pszAnyAttrNameList must be freed if failed in this routine
|
||
// If success, it will be freed in notification.
|
||
|
||
// Allocate memory for keeping returned attributes' names
|
||
//
|
||
cTotalNames += cAnyAttrNames;
|
||
ppszNameList = (TCHAR **) MemAlloc (sizeof (TCHAR *) * (cTotalNames + 1));
|
||
if (ppszNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
MemFree (pszAnyAttrNameList);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
}
|
||
|
||
// Set standard attribute names
|
||
//
|
||
ULONG i;
|
||
for (i = 0; i < COUNT_ENUM_RES_CLIENT_INFO; i++)
|
||
{
|
||
ppszNameList[i] = (TCHAR *) c_apszClientStdAttrNames[i];
|
||
}
|
||
|
||
// Set arbitrary attribute names if needed
|
||
//
|
||
TCHAR *psz;
|
||
psz = pszAnyAttrNameList;
|
||
for (i = COUNT_ENUM_RES_CLIENT_INFO; i < cTotalNames; i++)
|
||
{
|
||
ppszNameList[i] = psz;
|
||
psz += lstrlen (psz) + 1;
|
||
}
|
||
|
||
// Terminate the list
|
||
//
|
||
ppszNameList[cTotalNames] = NULL;
|
||
|
||
// Get the session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr == S_OK)
|
||
{
|
||
// Get an ldap session
|
||
//
|
||
MyAssert (pSession != NULL);
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send the search query
|
||
//
|
||
uMsgID = ldap_search ( ld,
|
||
(TCHAR *) &c_szDefClientBaseDN[0], // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter, // filter
|
||
ppszNameList, // attrs[]
|
||
0); // both type and value
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
MyAssert (hr != S_OK);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
}
|
||
}
|
||
|
||
// Free the filter string
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Free the buffer holding all returned attribute names if needed
|
||
//
|
||
if (ppszNameList != &apszAttrNames[0])
|
||
MemFree (ppszNameList);
|
||
|
||
// If failed, exit with cleanup
|
||
//
|
||
if (hr != S_OK)
|
||
{
|
||
// Free extended attribute names list if needed
|
||
//
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
MemFree (pszAnyAttrNameList);
|
||
|
||
// Report failure
|
||
//
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = WM_ILS_RESOLVE_CLIENT;
|
||
ri.cAnyAttrs = cAnyAttrNames;
|
||
ri.pszAnyAttrNameList = pszAnyAttrNameList;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_CLIENTINFO_RES *pcir = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
pcir = (LDAP_CLIENTINFO_RES *) MemAlloc (sizeof (LDAP_CLIENTINFO_RES));
|
||
if (pcir != NULL)
|
||
{
|
||
pcir->uSize = sizeof (*pcir);
|
||
pcir->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) pcir;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_ResolveProtocol
|
||
|
||
History:
|
||
10/15/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
10/30/96 Chu, Lon-Chan [lonchanc]
|
||
Blocked by ILS (7438, 7442)
|
||
---------------------------------------------------------------------- */
|
||
|
||
HRESULT UlsLdap_ResolveProtocol (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszUserName,
|
||
TCHAR *pszAppName,
|
||
TCHAR *pszProtName,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
if (MyIsBadServerInfo (pServer) || MyIsBadString (pszUserName) ||
|
||
MyIsBadString (pszAppName) || MyIsBadString (pszProtName) ||
|
||
pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeUserName = (lstrlen (pszUserName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeAppName = (lstrlen (pszAppName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeProtName = (lstrlen (pszProtName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeAnyAttrNames = 0;
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
ULONG cch;
|
||
for (ULONG i = 0; i < cAnyAttrNames; i++)
|
||
{
|
||
cch = lstrlen (psz) + 1;
|
||
cbSizeAnyAttrNames += cch * sizeof (TCHAR);
|
||
psz += cch;
|
||
}
|
||
ULONG cParams = 6;
|
||
ULONG cbSize = cbServer + cbSizeUserName + cbSizeAppName +
|
||
cbSizeProtName + cbSizeAnyAttrNames;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_RESOLVE_PROTOCOL, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD_PTR) pszUserName, cbSizeUserName);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD_PTR) pszAppName, cbSizeAppName);
|
||
MarshalReq_SetParam (pReq, 3, (DWORD_PTR) pszProtName, cbSizeProtName);
|
||
MarshalReq_SetParam (pReq, 4, (DWORD_PTR) pszAnyAttrNameList, cbSizeAnyAttrNames);
|
||
MarshalReq_SetParam (pReq, 5, (DWORD) cAnyAttrNames, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_ResolveProtocol ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_RESOLVE_PROTOCOL);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszUserName = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
TCHAR *pszAppName = (TCHAR *) MarshalReq_GetParam (pReq, 2);
|
||
TCHAR *pszProtName = (TCHAR *) MarshalReq_GetParam (pReq, 3);
|
||
TCHAR *pszAnyAttrNameList = (TCHAR *) MarshalReq_GetParam (pReq, 4);
|
||
ULONG cAnyAttrNames = (ULONG) MarshalReq_GetParam (pReq, 5);
|
||
|
||
TCHAR *pszFilter = NULL;
|
||
|
||
// Duplicate the protocol name to resolve
|
||
//
|
||
TCHAR *pszProtNameToResolve = My_strdup (pszProtName);
|
||
if (pszProtNameToResolve == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create a resolve client filter
|
||
//
|
||
pszFilter = ProtCreateResolveFilter (pszUserName, pszAppName, pszProtName);
|
||
if (pszFilter == NULL)
|
||
{
|
||
MemFree (pszProtNameToResolve);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[COUNT_ENUM_PROTATTR+1];
|
||
TCHAR **ppszNameList;
|
||
ppszNameList = &apszAttrNames[0];
|
||
ULONG cTotalNames;
|
||
cTotalNames = COUNT_ENUM_PROTATTR;
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
{
|
||
// Prefix arbitrary attribute names
|
||
//
|
||
pszAnyAttrNameList = IlsPrefixNameValueArray (FALSE, cAnyAttrNames,
|
||
(const TCHAR *) pszAnyAttrNameList);
|
||
if (pszAnyAttrNameList == NULL)
|
||
{
|
||
MemFree (pszProtNameToResolve);
|
||
MemFree (pszFilter);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Allocate memory for returned attributes' names
|
||
//
|
||
cTotalNames += cAnyAttrNames;
|
||
ppszNameList = (TCHAR **) MemAlloc (sizeof (TCHAR *) * (cTotalNames + 1));
|
||
if (ppszNameList == NULL)
|
||
{
|
||
MemFree (pszProtNameToResolve);
|
||
MemFree (pszFilter);
|
||
MemFree (pszAnyAttrNameList);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
}
|
||
|
||
// Set standard attribute names
|
||
//
|
||
ULONG i;
|
||
for (i = 0; i < COUNT_ENUM_PROTATTR; i++)
|
||
{
|
||
ppszNameList[i] = (TCHAR *) c_apszProtStdAttrNames[i];
|
||
}
|
||
|
||
// Set arbitrary attribute names if needed
|
||
//
|
||
TCHAR *psz;
|
||
psz = pszAnyAttrNameList;
|
||
for (i = COUNT_ENUM_PROTATTR; i < cTotalNames; i++)
|
||
{
|
||
ppszNameList[i] = psz;
|
||
psz += lstrlen (psz) + 1;
|
||
}
|
||
|
||
// Terminate the list
|
||
//
|
||
ppszNameList[cTotalNames] = NULL;
|
||
|
||
// Get the session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr == S_OK)
|
||
{
|
||
// Get an ldap session
|
||
//
|
||
MyAssert (pSession != NULL);
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send the search query
|
||
//
|
||
uMsgID = ldap_search (ld, (TCHAR *) &c_szDefClientBaseDN[0], // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter,
|
||
ppszNameList, // attrs[]
|
||
0); // both type and value
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
MyAssert (hr != S_OK);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
}
|
||
}
|
||
|
||
// Free the filter string
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Free the buffer holding all returned attribute names if needed
|
||
//
|
||
if (ppszNameList != &apszAttrNames[0])
|
||
MemFree (ppszNameList);
|
||
|
||
// If failed, exit with cleanup
|
||
//
|
||
if (hr != S_OK)
|
||
{
|
||
// Free duplicated protocol name
|
||
//
|
||
MemFree (pszProtNameToResolve);
|
||
|
||
// Free extended attribute names list if needed
|
||
//
|
||
if (cAnyAttrNames != 0)
|
||
MemFree (pszAnyAttrNameList);
|
||
|
||
// Report failure
|
||
//
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = WM_ILS_RESOLVE_PROTOCOL;
|
||
ri.cAnyAttrs = cAnyAttrNames;
|
||
ri.pszAnyAttrNameList = pszAnyAttrNameList;
|
||
ri.pszProtNameToResolve = pszProtNameToResolve;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Free duplicated protocol name
|
||
//
|
||
MemFree (pszProtNameToResolve);
|
||
|
||
// Free extended attribute names list if needed
|
||
//
|
||
if (cAnyAttrNames != 0)
|
||
MemFree (pszAnyAttrNameList);
|
||
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_PROTINFO_RES *ppir = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
ppir = (LDAP_PROTINFO_RES *) MemAlloc (sizeof (LDAP_PROTINFO_RES));
|
||
if (ppir != NULL)
|
||
{
|
||
ppir->uSize = sizeof (*ppir);
|
||
ppir->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) ppir;
|
||
}
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_ResolveMeeting
|
||
|
||
Input:
|
||
pszServer: A server name.
|
||
pszMeetingID: A meeting id string.
|
||
pszAnyAttrName: A pointer to a series of strings.
|
||
cAnyAttrNames: A count of strings in the series.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT UlsLdap_ResolveMeeting (
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszMtgName,
|
||
TCHAR *pszAnyAttrNameList,
|
||
ULONG cAnyAttrNames,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
if (MyIsBadServerInfo (pServer) || MyIsBadString (pszMtgName))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeMtgName = (lstrlen (pszMtgName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeAnyAttrNames = 0;
|
||
TCHAR *psz = pszAnyAttrNameList;
|
||
ULONG cch;
|
||
for (ULONG i = 0; i < cAnyAttrNames; i++)
|
||
{
|
||
cch = lstrlen (psz) + 1;
|
||
cbSizeAnyAttrNames += cch * sizeof (TCHAR);
|
||
psz += cch;
|
||
}
|
||
ULONG cParams = 4;
|
||
ULONG cbSize = cbServer + cbSizeMtgName + cbSizeAnyAttrNames;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (WM_ILS_RESOLVE_MEETING, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD) pszMtgName, cbSizeMtgName);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) pszAnyAttrNameList, cbSizeAnyAttrNames);
|
||
MarshalReq_SetParam (pReq, 3, (DWORD) cAnyAttrNames, 0);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_ResolveMeeting ( MARSHAL_REQ *pReq )
|
||
{
|
||
HRESULT hr = S_OK;
|
||
SP_CSession *pSession = NULL;
|
||
LDAP *ld;
|
||
ULONG uMsgID = (ULONG) -1;
|
||
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert (pReq->uNotifyMsg == WM_ILS_RESOLVE_MEETING);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszMtgName = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
TCHAR *pszAnyAttrNameList = (TCHAR *) MarshalReq_GetParam (pReq, 2);
|
||
ULONG cAnyAttrNames = (ULONG) MarshalReq_GetParam (pReq, 3);
|
||
|
||
// Create a resolve client filter
|
||
//
|
||
TCHAR *pszFilter = MtgCreateResolveFilter (pszMtgName);
|
||
if (pszFilter == NULL)
|
||
{
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Create an array of names of attributes to return
|
||
//
|
||
TCHAR *apszAttrNames[COUNT_ENUM_MTGATTR+1];
|
||
TCHAR **ppszNameList;
|
||
ppszNameList = &apszAttrNames[0];
|
||
ULONG cTotalNames;
|
||
cTotalNames = COUNT_ENUM_MTGATTR;
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
{
|
||
// Prefix arbitrary attribute names
|
||
//
|
||
pszAnyAttrNameList = IlsPrefixNameValueArray (FALSE, cAnyAttrNames,
|
||
(const TCHAR *) pszAnyAttrNameList);
|
||
if (pszAnyAttrNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
|
||
// Allocate memory for returned attributes' names
|
||
//
|
||
cTotalNames += cAnyAttrNames;
|
||
ppszNameList = (TCHAR **) MemAlloc (sizeof (TCHAR *) * (cTotalNames + 1));
|
||
if (ppszNameList == NULL)
|
||
{
|
||
MemFree (pszFilter);
|
||
MemFree (pszAnyAttrNameList);
|
||
hr = ILS_E_MEMORY;
|
||
goto MyExit;
|
||
}
|
||
}
|
||
|
||
// Set standard attribute names
|
||
//
|
||
ULONG i;
|
||
for (i = 0; i < COUNT_ENUM_MTGATTR; i++)
|
||
{
|
||
ppszNameList[i] = (TCHAR *) c_apszMtgStdAttrNames[i];
|
||
}
|
||
|
||
// Set arbitrary attribute names if needed
|
||
//
|
||
TCHAR *psz;
|
||
psz = pszAnyAttrNameList;
|
||
for (i = COUNT_ENUM_MTGATTR; i < cTotalNames; i++)
|
||
{
|
||
ppszNameList[i] = psz;
|
||
psz += lstrlen (psz) + 1;
|
||
}
|
||
|
||
// Terminate the list
|
||
//
|
||
ppszNameList[cTotalNames] = NULL;
|
||
|
||
// Get the session object
|
||
//
|
||
hr = g_pSessionContainer->GetSession (&pSession, pServer);
|
||
if (hr == S_OK)
|
||
{
|
||
// Get an ldap session
|
||
//
|
||
MyAssert (pSession != NULL);
|
||
ld = pSession->GetLd ();
|
||
MyAssert (ld != NULL);
|
||
|
||
// Update options in ld
|
||
//
|
||
ld->ld_sizelimit = 0; // no limit in the num of entries to return
|
||
ld->ld_timelimit = 0; // no limit on the time to spend on the search
|
||
ld->ld_deref = LDAP_DEREF_ALWAYS;
|
||
|
||
// Send the search query
|
||
//
|
||
uMsgID = ldap_search (ld, (TCHAR *) &c_szDefMtgBaseDN[0], // base DN
|
||
LDAP_SCOPE_BASE, // scope
|
||
pszFilter,
|
||
ppszNameList, // attrs[]
|
||
0); // both type and value
|
||
if (uMsgID == -1)
|
||
{
|
||
// This ldap_search failed.
|
||
// Convert ldap error code to hr
|
||
//
|
||
hr = ::LdapError2Hresult (ld->ld_errno);
|
||
MyAssert (hr != S_OK);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
}
|
||
}
|
||
|
||
// Free the filter string
|
||
//
|
||
MemFree (pszFilter);
|
||
|
||
// Free the buffer holding all returned attribute names if needed
|
||
//
|
||
if (ppszNameList != &apszAttrNames[0])
|
||
MemFree (ppszNameList);
|
||
|
||
// If failed, exit with cleanup
|
||
//
|
||
if (hr != S_OK)
|
||
{
|
||
// Free extended attribute names list if needed
|
||
//
|
||
if (pszAnyAttrNameList != NULL && cAnyAttrNames != 0)
|
||
MemFree (pszAnyAttrNameList);
|
||
|
||
// Report failure
|
||
//
|
||
goto MyExit;
|
||
}
|
||
|
||
// Construct a pending info structure
|
||
//
|
||
RESP_INFO ri;
|
||
FillDefRespInfo (&ri, pReq->uRespID, ld, uMsgID, INVALID_MSG_ID);
|
||
ri.uNotifyMsg = WM_ILS_RESOLVE_MEETING;
|
||
ri.cAnyAttrs = cAnyAttrNames;
|
||
ri.pszAnyAttrNameList = pszAnyAttrNameList;
|
||
|
||
// Queue this pending response
|
||
//
|
||
hr = g_pRespQueue->EnterRequest (pSession, &ri);
|
||
if (hr != S_OK)
|
||
{
|
||
// Abort the ldap_search
|
||
//
|
||
ldap_abandon (ld, uMsgID);
|
||
|
||
// Free the session object
|
||
//
|
||
pSession->Disconnect ();
|
||
MyAssert (FALSE);
|
||
}
|
||
|
||
MyExit:
|
||
|
||
LDAP_MEETINFO_RES *pmir = NULL;
|
||
if (hr != S_OK)
|
||
{
|
||
pmir = (LDAP_MEETINFO_RES *) MemAlloc (sizeof (LDAP_MEETINFO_RES));
|
||
if (pmir != NULL)
|
||
{
|
||
pmir->uSize = sizeof (*pmir);
|
||
pmir->hResult = hr;
|
||
}
|
||
}
|
||
|
||
return (LPARAM) pmir;
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_AddAttendee
|
||
|
||
Input:
|
||
pszServer: server name.
|
||
pszMeetingID: a meeting id string.
|
||
pszAttendeeID: an attendee id string.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT My_UpdateAttendees (
|
||
ULONG uNotifyMsg,
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszMtgName,
|
||
ULONG cMembers,
|
||
TCHAR *pszMemberNames,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
HRESULT hr;
|
||
|
||
MyAssert ( uNotifyMsg == WM_ILS_ADD_ATTENDEE ||
|
||
uNotifyMsg == WM_ILS_REMOVE_ATTENDEE);
|
||
|
||
// Make sure this service provider is initialized
|
||
//
|
||
if (g_cInitialized <= 0)
|
||
return ILS_E_NOT_INITIALIZED;
|
||
|
||
// Make sure we there are members to add
|
||
//
|
||
if (cMembers == 0)
|
||
return ILS_E_PARAMETER;
|
||
|
||
// Make sure we have valid pointers
|
||
//
|
||
if (MyIsBadServerInfo (pServer) || MyIsBadString (pszMtgName) ||
|
||
MyIsBadString (pszMemberNames))
|
||
return ILS_E_POINTER;
|
||
|
||
// Make sure the async info structure is valid
|
||
//
|
||
if (pAsyncInfo == NULL)
|
||
return ILS_E_POINTER;
|
||
|
||
// Compute the total size of the data
|
||
//
|
||
ULONG cbServer = IlsGetLinearServerInfoSize (pServer);
|
||
ULONG cbSizeMtgName = (lstrlen (pszMtgName) + 1) * sizeof (TCHAR);
|
||
ULONG cbSizeMemberNames = 0;
|
||
TCHAR *psz = pszMemberNames;
|
||
for (ULONG i = 0; i < cMembers; i++)
|
||
{
|
||
ULONG cchName = lstrlen (psz) + 1;
|
||
cbSizeMemberNames += cchName * sizeof (TCHAR);
|
||
psz += cchName;
|
||
}
|
||
ULONG cParams = 4;
|
||
ULONG cbSize = cbServer + cbSizeMtgName + cbSizeMemberNames;
|
||
|
||
// Allocate marshall request buffer
|
||
//
|
||
MARSHAL_REQ *pReq = MarshalReq_Alloc (uNotifyMsg, cbSize, cParams);
|
||
if (pReq == NULL)
|
||
return ILS_E_MEMORY;
|
||
|
||
// Get the response ID
|
||
//
|
||
ULONG uRespID = pReq->uRespID;
|
||
|
||
// Linearize parameters
|
||
//
|
||
MarshalReq_SetParamServer (pReq, 0, pServer, cbServer);
|
||
MarshalReq_SetParam (pReq, 1, (DWORD) pszMtgName, cbSizeMtgName);
|
||
MarshalReq_SetParam (pReq, 2, (DWORD) cMembers, 0);
|
||
MarshalReq_SetParam (pReq, 3, (DWORD) pszMemberNames, cbSizeMemberNames);
|
||
|
||
// Enter the request
|
||
//
|
||
if (g_pReqQueue != NULL)
|
||
{
|
||
hr = g_pReqQueue->Enter (pReq);
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
hr = ILS_E_FAIL;
|
||
}
|
||
|
||
if (hr == S_OK)
|
||
{
|
||
pAsyncInfo->uMsgID = uRespID;
|
||
}
|
||
else
|
||
{
|
||
MemFree (pReq);
|
||
}
|
||
|
||
return hr;
|
||
}
|
||
|
||
|
||
LPARAM
|
||
AsynReq_UpdateAttendees ( MARSHAL_REQ *pReq )
|
||
{
|
||
MyAssert (GetCurrentThreadId () == g_dwReqThreadID);
|
||
|
||
MyAssert (pReq != NULL);
|
||
MyAssert ( pReq->uNotifyMsg == WM_ILS_ADD_ATTENDEE ||
|
||
pReq->uNotifyMsg == WM_ILS_REMOVE_ATTENDEE);
|
||
|
||
// Delinearize parameters
|
||
//
|
||
SERVER_INFO *pServer = (SERVER_INFO *) MarshalReq_GetParam (pReq, 0);
|
||
TCHAR *pszMtgName = (TCHAR *) MarshalReq_GetParam (pReq, 1);
|
||
ULONG cMembers = (ULONG) MarshalReq_GetParam (pReq, 2);
|
||
TCHAR *pszMemberNames = (TCHAR *) MarshalReq_GetParam (pReq, 3);
|
||
|
||
// Set standard attributes
|
||
//
|
||
return (LPARAM) MtgUpdateMembers (pReq->uNotifyMsg,
|
||
pServer,
|
||
pszMtgName,
|
||
cMembers,
|
||
pszMemberNames,
|
||
pReq->uRespID);
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT UlsLdap_AddAttendee(
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszMtgName,
|
||
ULONG cMembers,
|
||
TCHAR *pszMemberNames,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
return My_UpdateAttendees ( WM_ILS_ADD_ATTENDEE,
|
||
pServer,
|
||
pszMtgName,
|
||
cMembers,
|
||
pszMemberNames,
|
||
pAsyncInfo);
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_RemoveAttendee
|
||
|
||
Input:
|
||
pszServer: server name.
|
||
pszMeetingID: a meeting id string.
|
||
pszAttendeeID: an attendee id string.
|
||
pAsyncInfo: a pointer to async info structure.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
HRESULT UlsLdap_RemoveAttendee(
|
||
SERVER_INFO *pServer,
|
||
TCHAR *pszMtgName,
|
||
ULONG cMembers,
|
||
TCHAR *pszMemberNames,
|
||
LDAP_ASYNCINFO *pAsyncInfo )
|
||
{
|
||
return My_UpdateAttendees ( WM_ILS_REMOVE_ATTENDEE,
|
||
pServer,
|
||
pszMtgName,
|
||
cMembers,
|
||
pszMemberNames,
|
||
pAsyncInfo);
|
||
}
|
||
#endif // ENABLE_MEETING_PLACE
|
||
|
||
|
||
/* ----------------------------------------------------------------------
|
||
UlsLdap_GetStdAttrNameString
|
||
|
||
Input:
|
||
StdName: a standard attribute index.
|
||
|
||
History:
|
||
12/02/96 Chu, Lon-Chan [lonchanc]
|
||
Created.
|
||
---------------------------------------------------------------------- */
|
||
|
||
typedef struct
|
||
{
|
||
#ifdef DEBUG
|
||
LONG nIndex;
|
||
#endif
|
||
const TCHAR **ppszName;
|
||
}
|
||
ATTR_NAME_ENTRY;
|
||
|
||
|
||
const ATTR_NAME_ENTRY c_aAttrNameTbl[ILS_NUM_OF_STDATTRS] =
|
||
{
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_NULL,
|
||
#endif
|
||
NULL
|
||
},
|
||
|
||
// User standard attribute names
|
||
//
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_USER_ID,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_CN]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_IP_ADDRESS,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_IP_ADDRESS]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_EMAIL_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_EMAIL_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_FIRST_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_FIRST_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_LAST_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_LAST_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_CITY_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_CITY_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_COUNTRY_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_C]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_COMMENT,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_COMMENT]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_FLAGS,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_FLAGS]
|
||
},
|
||
|
||
// Application standard attribute names
|
||
//
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_APP_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_APP_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_APP_MIME_TYPE,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_APP_MIME_TYPE]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_APP_GUID,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_APP_GUID]
|
||
},
|
||
|
||
// Protocol standard attribute names
|
||
//
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_PROTOCOL_NAME,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_PROT_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_PROTOCOL_MIME_TYPE,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_PROT_MIME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_PROTOCOL_PORT,
|
||
#endif
|
||
&c_apszClientStdAttrNames[ENUM_CLIENTATTR_PROT_PORT]
|
||
},
|
||
|
||
#ifdef ENABLE_MEETING_PLACE
|
||
// Meeting place attribute names
|
||
//
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_MEETING_ID,
|
||
#endif
|
||
&c_apszMtgStdAttrNames[ENUM_MTGATTR_CN]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_MEETING_HOST_NAME,
|
||
#endif
|
||
&c_apszMtgStdAttrNames[ENUM_MTGATTR_HOST_NAME]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_MEETING_HOST_IP_ADDRESS,
|
||
#endif
|
||
&c_apszMtgStdAttrNames[ENUM_MTGATTR_IP_ADDRESS]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_MEETING_DESCRIPTION,
|
||
#endif
|
||
&c_apszMtgStdAttrNames[ENUM_MTGATTR_DESCRIPTION]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_MEETING_TYPE,
|
||
#endif
|
||
&c_apszMtgStdAttrNames[ENUM_MTGATTR_MTG_TYPE]
|
||
},
|
||
{
|
||
#ifdef DEBUG
|
||
(LONG) ILS_STDATTR_ATTENDEE_TYPE,
|
||
#endif
|
||
&c_apszMtgStdAttrNames[ENUM_MTGATTR_MEMBER_TYPE]
|
||
},
|
||
#endif // ENABLE_MEETING_PLACE
|
||
};
|
||
|
||
|
||
const TCHAR *UlsLdap_GetStdAttrNameString ( ILS_STD_ATTR_NAME StdName )
|
||
{
|
||
ULONG nIndex = (LONG) StdName;
|
||
|
||
MyAssert (((LONG) ILS_STDATTR_NULL < nIndex) && (nIndex < (LONG) ILS_NUM_OF_STDATTRS));
|
||
|
||
return *(c_aAttrNameTbl[nIndex].ppszName);
|
||
}
|
||
|
||
|
||
#ifdef DEBUG
|
||
VOID DbgValidateStdAttrNameArray ( VOID )
|
||
{
|
||
MyAssert (ARRAY_ELEMENTS (c_aAttrNameTbl) == ILS_NUM_OF_STDATTRS);
|
||
|
||
for (LONG i = 0; i < ILS_NUM_OF_STDATTRS; i++)
|
||
{
|
||
if (i == c_aAttrNameTbl[i].nIndex)
|
||
{
|
||
if (i != ILS_STDATTR_NULL &&
|
||
My_lstrlen (*(c_aAttrNameTbl[i].ppszName)) == 0)
|
||
{
|
||
MyAssert (FALSE);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
MyAssert (FALSE);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
#endif
|
||
|
||
|
||
|
||
/* =============== helper functions =============== */
|
||
|
||
const TCHAR g_szShowEntries[] = TEXT ("(cn=");
|
||
const INT g_nLengthShowEntries = ARRAY_ELEMENTS (g_szShowEntries) - 1;
|
||
const TCHAR g_szShowAllEntries[] = TEXT ("(cn=*)");
|
||
const INT g_nShowAllEntries = ARRAY_ELEMENTS (g_szShowAllEntries) - 1;
|
||
|
||
TCHAR *AddBaseToFilter ( TCHAR *pszFilter, const TCHAR *pszDefBase )
|
||
{
|
||
MyAssert (pszDefBase != NULL);
|
||
|
||
// Calculate the size for "(&(objectclass=RTPerson)())"
|
||
//
|
||
ULONG cbSize = (lstrlen (pszDefBase) + 8 + g_nShowAllEntries) * sizeof (TCHAR);
|
||
|
||
// Look through the filter string to figure out that
|
||
// will this string shows entries???
|
||
//
|
||
TCHAR *pszShowEntries = (TCHAR *) &g_szShowAllEntries[0];
|
||
if (pszFilter != NULL)
|
||
{
|
||
for (TCHAR *psz = pszFilter; *psz != TEXT ('\0'); psz = CharNext (psz))
|
||
{
|
||
if (lstrlen (psz) > g_nLengthShowEntries)
|
||
{
|
||
TCHAR ch = psz[g_nLengthShowEntries]; // remember
|
||
psz[g_nLengthShowEntries] = TEXT ('\0');
|
||
|
||
INT nCmp = lstrcmpi (psz, &g_szShowEntries[0]);
|
||
psz[g_nLengthShowEntries] = ch; // restore
|
||
if (nCmp == 0)
|
||
{
|
||
// Matched
|
||
//
|
||
pszShowEntries = STR_EMPTY;
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
// It is impossible to match it
|
||
//
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
// If the filter is null, then only provide "(objectclass=RTPerson)"
|
||
//
|
||
if (pszFilter != NULL)
|
||
cbSize += lstrlen (pszFilter) * sizeof (TCHAR);
|
||
|
||
// Allocate new memory for filter
|
||
//
|
||
TCHAR *pszNewFilter = (TCHAR *) MemAlloc (cbSize);
|
||
if (pszNewFilter != NULL)
|
||
{
|
||
wsprintf (pszNewFilter, TEXT ("(&(%s)%s"), pszDefBase, pszShowEntries);
|
||
TCHAR *psz = pszNewFilter + lstrlen (pszNewFilter);
|
||
|
||
if (pszFilter != NULL)
|
||
{
|
||
wsprintf (psz, (*pszFilter == TEXT ('(')) ? TEXT ("%s") : TEXT ("(%s)"),
|
||
pszFilter);
|
||
}
|
||
lstrcat (psz, TEXT (")"));
|
||
|
||
// Go through the filter and convert '*' to '%'
|
||
//
|
||
for (psz = pszNewFilter; *psz != TEXT ('\0'); psz = CharNext (psz))
|
||
{
|
||
if (*psz == TEXT ('*'))
|
||
*psz = TEXT ('%');
|
||
}
|
||
}
|
||
|
||
return pszNewFilter;
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|