2747 lines
60 KiB
C++
2747 lines
60 KiB
C++
//****************************************************************************
|
|
//
|
|
// Module: ULS.DLL
|
|
// File: culs.cpp
|
|
// Content: This file contains the ULS object.
|
|
// History:
|
|
// Wed 17-Apr-1996 11:13:54 -by- Viroon Touranachun [viroont]
|
|
//
|
|
// Copyright (c) Microsoft Corporation 1996-1997
|
|
//
|
|
//****************************************************************************
|
|
|
|
#include "ulsp.h"
|
|
#include "culs.h"
|
|
#include "localusr.h"
|
|
#include "attribs.h"
|
|
#include "localprt.h"
|
|
#include "callback.h"
|
|
#include "filter.h"
|
|
#include "sputils.h"
|
|
#include "ulsmeet.h"
|
|
|
|
//****************************************************************************
|
|
// Constant and static text definition
|
|
//****************************************************************************
|
|
//
|
|
#define ILS_WND_CLASS TEXT("UserLocationServicesClass")
|
|
#define ILS_WND_NAME TEXT("ULSWnd")
|
|
#define ILS_DATABASE_MUTEX TEXT("User Location Service Database")
|
|
|
|
//****************************************************************************
|
|
// Global Parameters
|
|
//****************************************************************************
|
|
//
|
|
CIlsMain *g_pCIls = NULL;
|
|
CReqMgr *g_pReqMgr = NULL;
|
|
HWND g_hwndCulsWindow = NULL;
|
|
|
|
//****************************************************************************
|
|
// Event Notifiers
|
|
//****************************************************************************
|
|
//
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// OnNotifyEnumUserNamesResult (IUnknown *pUnk, void *pv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HRESULT
|
|
OnNotifyEnumUserNamesResult (IUnknown *pUnk, void *pv)
|
|
{
|
|
CEnumNames *penum = NULL;
|
|
PENUMRINFO peri = (PENUMRINFO)pv;
|
|
HRESULT hr = peri->hResult;
|
|
|
|
// Create the enumerator only when there is anything to be enumerated
|
|
//
|
|
if (hr == NOERROR)
|
|
{
|
|
ASSERT (peri->pv != NULL);
|
|
|
|
// Create a UserName enumerator
|
|
//
|
|
penum = new CEnumNames;
|
|
|
|
if (penum != NULL)
|
|
{
|
|
hr = penum->Init((LPTSTR)peri->pv, peri->cItems);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
penum->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete penum;
|
|
penum = NULL;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
};
|
|
|
|
// Notify the sink object
|
|
//
|
|
((IIlsNotify*)pUnk)->EnumUserNamesResult(peri->uReqID,
|
|
penum != NULL ?
|
|
(IEnumIlsNames *)penum :
|
|
NULL,
|
|
hr);
|
|
|
|
if (penum != NULL)
|
|
{
|
|
penum->Release();
|
|
};
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// OnNotifyGetUserResult (IUnknown *pUnk, void *pv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HRESULT
|
|
OnNotifyGetUserResult (IUnknown *pUnk, void *pv)
|
|
{
|
|
POBJRINFO pobjri = (POBJRINFO)pv;
|
|
|
|
((IIlsNotify*)pUnk)->GetUserResult(pobjri->uReqID,
|
|
(IIlsUser *)pobjri->pv,
|
|
pobjri->hResult);
|
|
return S_OK;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// OnNotifyGetUserResult (IUnknown *pUnk, void *pv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT
|
|
OnNotifyGetMeetingPlaceResult (IUnknown *pUnk, void *pv)
|
|
{
|
|
POBJRINFO pobjri = (POBJRINFO)pv;
|
|
|
|
((IIlsNotify*)pUnk)->GetMeetingPlaceResult(pobjri->uReqID,
|
|
(IIlsMeetingPlace *)pobjri->pv,
|
|
pobjri->hResult);
|
|
return S_OK;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// OnNotifyEnumUsersResult (IUnknown *pUnk, void *pv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HRESULT
|
|
OnNotifyEnumUsersResult (IUnknown *pUnk, void *pv)
|
|
{
|
|
CEnumUsers *penum = NULL;
|
|
PENUMRINFO peri = (PENUMRINFO)pv;
|
|
HRESULT hr = peri->hResult;
|
|
|
|
if (hr == NOERROR)
|
|
{
|
|
ASSERT (peri->pv != NULL);
|
|
|
|
// Create a UserName enumerator
|
|
//
|
|
penum = new CEnumUsers;
|
|
|
|
if (penum != NULL)
|
|
{
|
|
hr = penum->Init((CIlsUser **)peri->pv, peri->cItems);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
penum->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete penum;
|
|
penum = NULL;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
};
|
|
|
|
// Notify the sink object
|
|
//
|
|
((IIlsNotify*)pUnk)->EnumUsersResult(peri->uReqID,
|
|
penum != NULL ?
|
|
(IEnumIlsUsers *)penum :
|
|
NULL,
|
|
hr);
|
|
|
|
if (penum != NULL)
|
|
{
|
|
penum->Release();
|
|
};
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// OnNotifyEnumMeetingPlacesResult (IUnknown *pUnk, void *pv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT
|
|
OnNotifyEnumMeetingPlacesResult (IUnknown *pUnk, void *pv)
|
|
{
|
|
CEnumMeetingPlaces *penum = NULL;
|
|
PENUMRINFO peri = (PENUMRINFO)pv;
|
|
HRESULT hr = peri->hResult;
|
|
|
|
if (hr == NOERROR)
|
|
{
|
|
ASSERT (peri->pv != NULL);
|
|
|
|
// Create a MeetingPlace enumerator
|
|
//
|
|
penum = new CEnumMeetingPlaces;
|
|
|
|
if (penum != NULL)
|
|
{
|
|
// jam it with the data that we got
|
|
hr = penum->Init((CIlsMeetingPlace **)peri->pv, peri->cItems);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
penum->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete penum;
|
|
penum = NULL;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
};
|
|
|
|
// Notify the sink object
|
|
//
|
|
((IIlsNotify*)pUnk)->EnumMeetingPlacesResult(peri->uReqID,
|
|
penum != NULL ?
|
|
(IEnumIlsMeetingPlaces *)penum :
|
|
NULL,
|
|
hr);
|
|
|
|
if (penum != NULL)
|
|
{
|
|
penum->Release();
|
|
};
|
|
return hr;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// OnNotifyEnumMeetingPlaceNamesResult (IUnknown *pUnk, void *pv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT
|
|
OnNotifyEnumMeetingPlaceNamesResult (IUnknown *pUnk, void *pv)
|
|
{
|
|
CEnumNames *penum = NULL;
|
|
PENUMRINFO peri = (PENUMRINFO)pv;
|
|
HRESULT hr = peri->hResult;
|
|
|
|
// Create the enumerator only when there is anything to be enumerated
|
|
//
|
|
if (hr == NOERROR)
|
|
{
|
|
ASSERT (peri->pv != NULL);
|
|
|
|
// Create a MeetingPlaceName enumerator
|
|
//
|
|
penum = new CEnumNames;
|
|
|
|
if (penum != NULL)
|
|
{
|
|
hr = penum->Init((LPTSTR)peri->pv, peri->cItems);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
penum->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete penum;
|
|
penum = NULL;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
};
|
|
|
|
// Notify the sink object
|
|
//
|
|
((IIlsNotify*)pUnk)->EnumMeetingPlaceNamesResult(peri->uReqID,
|
|
penum != NULL ?
|
|
(IEnumIlsNames *)penum :
|
|
NULL,
|
|
hr);
|
|
|
|
if (penum != NULL)
|
|
{
|
|
penum->Release();
|
|
};
|
|
return hr;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
//****************************************************************************
|
|
// Class Implementation
|
|
//****************************************************************************
|
|
//
|
|
//****************************************************************************
|
|
// CIlsMain::CIls (void)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
CIlsMain::
|
|
CIlsMain ( VOID )
|
|
:m_cRef (0),
|
|
fInit (FALSE),
|
|
hwndCallback (NULL),
|
|
pConnPt (NULL)
|
|
{
|
|
::EnterCriticalSection (&g_ULSSem);
|
|
g_pCIls = this;
|
|
::LeaveCriticalSection (&g_ULSSem);
|
|
}
|
|
|
|
//****************************************************************************
|
|
// CIlsMain::~CIls (void)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
CIlsMain::
|
|
~CIlsMain ( VOID )
|
|
{
|
|
ASSERT (m_cRef == 0);
|
|
|
|
// Free up resources
|
|
//
|
|
Uninitialize();
|
|
|
|
// Release the connection point
|
|
//
|
|
if (pConnPt != NULL)
|
|
{
|
|
pConnPt->ContainerReleased();
|
|
((IConnectionPoint*)pConnPt)->Release();
|
|
};
|
|
|
|
// We are gone now
|
|
//
|
|
::EnterCriticalSection (&g_ULSSem);
|
|
g_pCIls = NULL;
|
|
::LeaveCriticalSection (&g_ULSSem);
|
|
|
|
return;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::Init (void)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::Init (void)
|
|
{
|
|
HRESULT hr;
|
|
|
|
// Make the connection point
|
|
//
|
|
pConnPt = new CConnectionPoint (&IID_IIlsNotify,
|
|
(IConnectionPointContainer *)this);
|
|
if (pConnPt != NULL)
|
|
{
|
|
((IConnectionPoint*)pConnPt)->AddRef();
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::QueryInterface (REFIID riid, void **ppv)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::QueryInterface (REFIID riid, void **ppv)
|
|
{
|
|
*ppv = NULL;
|
|
|
|
if (riid == IID_IIlsMain || riid == IID_IUnknown)
|
|
{
|
|
*ppv = (IIlsMain *) this;
|
|
}
|
|
else
|
|
{
|
|
if (riid == IID_IConnectionPointContainer)
|
|
{
|
|
*ppv = (IConnectionPointContainer *) this;
|
|
};
|
|
};
|
|
|
|
if (*ppv != NULL)
|
|
{
|
|
((LPUNKNOWN)*ppv)->AddRef();
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
return ILS_E_NO_INTERFACE;
|
|
};
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP_(ULONG)
|
|
// CIlsMain::AddRef (void)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:17 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CIlsMain::AddRef (void)
|
|
{
|
|
DllLock();
|
|
|
|
MyDebugMsg ((DM_REFCOUNT, "CIlsMain::AddRef: ref=%ld\r\n", m_cRef));
|
|
::InterlockedIncrement (&m_cRef);
|
|
return (ULONG) m_cRef;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP_(ULONG)
|
|
// CIlsMain::Release (void)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:26 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP_(ULONG)
|
|
CIlsMain::Release (void)
|
|
{
|
|
DllRelease();
|
|
|
|
ASSERT (m_cRef > 0);
|
|
|
|
MyDebugMsg ((DM_REFCOUNT, "CIlsMain::Release: ref=%ld\r\n", m_cRef));
|
|
if (::InterlockedDecrement (&m_cRef) == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return (ULONG) m_cRef;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::Initialize (BSTR bstrAppName, REFGUID rguid, BSTR bstrMimeType)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::Initialize ()
|
|
{
|
|
WNDCLASS wc;
|
|
HRESULT hr;
|
|
|
|
if (IsInitialized())
|
|
{
|
|
return ILS_E_FAIL;
|
|
};
|
|
|
|
// Activate the services
|
|
//
|
|
hr = ILS_E_FAIL;
|
|
fInit = TRUE;
|
|
|
|
|
|
// Fill in window class structure with parameters that describe the
|
|
// working window.
|
|
//
|
|
wc.style = CS_NOCLOSE;
|
|
wc.lpfnWndProc = ULSNotifyProc;
|
|
wc.cbClsExtra = 0;
|
|
wc.cbWndExtra = 0;
|
|
wc.hInstance = g_hInstance;
|
|
wc.hIcon = ::LoadIcon(NULL, IDI_APPLICATION);
|
|
wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
|
|
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
|
|
wc.lpszMenuName = NULL;
|
|
wc.lpszClassName = ILS_WND_CLASS;
|
|
|
|
if (::RegisterClass(&wc) != 0)
|
|
{
|
|
hwndCallback = ::CreateWindowEx(0L, ILS_WND_CLASS,
|
|
ILS_WND_NAME,
|
|
WS_OVERLAPPED,
|
|
0, 0, 100, 50,
|
|
NULL, NULL, g_hInstance, NULL);
|
|
if (hwndCallback != NULL)
|
|
{
|
|
// Initialize the request manager
|
|
//
|
|
g_pReqMgr = new CReqMgr;
|
|
|
|
if (g_pReqMgr != NULL)
|
|
{
|
|
// Initialize the LDAP layer
|
|
//
|
|
hr = ::UlsLdap_Initialize(hwndCallback);
|
|
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
};
|
|
};
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
Uninitialize();
|
|
}
|
|
else {
|
|
|
|
g_hwndCulsWindow = hwndCallback;
|
|
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::CreateUser
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
CreateUser (
|
|
BSTR bstrUserID,
|
|
BSTR bstrAppName,
|
|
IIlsUser **ppUser)
|
|
{
|
|
CIlsUser *plu;
|
|
HRESULT hr;
|
|
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// Validate parameter
|
|
//
|
|
if (ppUser == NULL)
|
|
{
|
|
return ILS_E_POINTER;
|
|
};
|
|
|
|
// Assume failure
|
|
//
|
|
*ppUser = NULL;
|
|
|
|
//
|
|
// Allocate a new user object
|
|
//
|
|
plu = new CIlsUser;
|
|
|
|
if (plu != NULL)
|
|
{
|
|
// Initialize the object
|
|
//
|
|
hr = plu->Init(bstrUserID, bstrAppName);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
*ppUser = (IIlsUser *)plu;
|
|
(*ppUser)->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete plu;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::Uninitialize (void)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::Uninitialize (void)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// Uninitialize the LDAP layer
|
|
//
|
|
::UlsLdap_Deinitialize();
|
|
|
|
// Remove the request manager
|
|
//
|
|
if (g_pReqMgr != NULL)
|
|
{
|
|
delete g_pReqMgr;
|
|
g_pReqMgr = NULL;
|
|
};
|
|
|
|
// Clear the callback window
|
|
//
|
|
if (hwndCallback != NULL)
|
|
{
|
|
::DestroyWindow(hwndCallback);
|
|
hwndCallback = NULL;
|
|
};
|
|
::UnregisterClass(ILS_WND_CLASS, g_hInstance);
|
|
|
|
// Flag that is is uninitialized
|
|
//
|
|
fInit = FALSE;
|
|
|
|
return S_OK;
|
|
};
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
if (pConnPt != NULL)
|
|
{
|
|
hr = pConnPt->Notify(pv, pfn);
|
|
};
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::CreateAttributes (ILS_ACCESS_CONTROL AccessControl, IIlsAttributes **ppAttributes)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
// 12/05/96 -by- Chu, Lon-Chan [lonchanc]
|
|
// Added access control.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
CreateAttributes ( ILS_ATTR_TYPE AttrType, IIlsAttributes **ppAttributes )
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
CAttributes *pa;
|
|
HRESULT hr;
|
|
|
|
// Validate parameter
|
|
//
|
|
if (ppAttributes == NULL)
|
|
{
|
|
return ILS_E_POINTER;
|
|
};
|
|
|
|
// Validate access control
|
|
//
|
|
if (AttrType != ILS_ATTRTYPE_NAME_ONLY &&
|
|
AttrType != ILS_ATTRTYPE_NAME_VALUE)
|
|
return ILS_E_PARAMETER;
|
|
|
|
// Assume failure
|
|
//
|
|
*ppAttributes = NULL;
|
|
|
|
// Allocate an attributes object
|
|
//
|
|
pa = new CAttributes;
|
|
if (pa != NULL)
|
|
{
|
|
pa->SetAccessType (AttrType);
|
|
pa->AddRef();
|
|
*ppAttributes = pa;
|
|
hr = NOERROR;
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
};
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::GetUser (BSTR bstrServerName, BSTR bstrUserID,
|
|
// ULONG *puReqID)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
GetUser (
|
|
IIlsServer *pIlsServer,
|
|
BSTR bstrUserID,
|
|
BSTR bstrAppID,
|
|
BSTR bstrProtID,
|
|
IIlsAttributes *pAttrib,
|
|
IIlsUser **ppUser,
|
|
ULONG *puReqID )
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
LDAP_ASYNCINFO ldai;
|
|
HRESULT hr;
|
|
|
|
// We do not implement synchronous operation
|
|
//
|
|
if (ppUser != NULL)
|
|
return ILS_E_NOT_IMPL;
|
|
|
|
// Validate parameters
|
|
//
|
|
if (::MyIsBadServer (pIlsServer) || bstrUserID == NULL || puReqID == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Clone the server object
|
|
//
|
|
pIlsServer = ((CIlsServer *) pIlsServer)->Clone ();
|
|
if (pIlsServer == NULL)
|
|
return ILS_E_MEMORY;
|
|
|
|
// Get a list of extended attribute names
|
|
//
|
|
TCHAR *pszList = NULL;
|
|
ULONG cList =0, cbList = 0;
|
|
if (pAttrib != NULL)
|
|
{
|
|
hr = ((CAttributes *) pAttrib)->GetAttributeList (&pszList, &cList, &cbList);
|
|
if (FAILED (hr))
|
|
{
|
|
pIlsServer->Release ();
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
// Initialize locals
|
|
//
|
|
TCHAR *pszUserID = NULL, *pszAppID = NULL, *pszProtID = NULL;
|
|
|
|
// Get from the specified server
|
|
//
|
|
hr = BSTR_to_LPTSTR(&pszUserID, bstrUserID);
|
|
if (FAILED (hr))
|
|
goto MyExit;
|
|
|
|
// Get the app id if given
|
|
//
|
|
if (bstrAppID != NULL)
|
|
{
|
|
hr = BSTR_to_LPTSTR (&pszAppID, bstrAppID);
|
|
if (FAILED (hr))
|
|
goto MyExit;
|
|
}
|
|
|
|
// Get the protocol id if given
|
|
//
|
|
if (bstrProtID != NULL)
|
|
{
|
|
hr = BSTR_to_LPTSTR (&pszProtID, bstrProtID);
|
|
if (FAILED (hr))
|
|
goto MyExit;
|
|
}
|
|
|
|
hr = ::UlsLdap_ResolveClient (((CIlsServer *) pIlsServer)->GetServerInfo (),
|
|
pszUserID,
|
|
pszAppID,
|
|
pszProtID,
|
|
pszList,
|
|
cList,
|
|
&ldai);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
COM_REQ_INFO ri;
|
|
ReqInfo_Init (&ri);
|
|
|
|
// If updating server was successfully requested, wait for the response
|
|
//
|
|
ri.uReqType = WM_ILS_RESOLVE_CLIENT;
|
|
ri.uMsgID = ldai.uMsgID;
|
|
|
|
ReqInfo_SetMain (&ri, this);
|
|
|
|
ReqInfo_SetServer (&ri, pIlsServer);
|
|
pIlsServer->AddRef ();
|
|
|
|
hr = g_pReqMgr->NewRequest(&ri);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Make sure the objects do not disappear before we get the response
|
|
//
|
|
this->AddRef();
|
|
|
|
// Return the request ID
|
|
//
|
|
*puReqID = ri.uReqID;
|
|
}
|
|
};
|
|
|
|
MyExit:
|
|
|
|
// Release the server object
|
|
//
|
|
pIlsServer->Release ();
|
|
|
|
// Free the list of extended attribute names
|
|
//
|
|
::MemFree (pszList);
|
|
|
|
// Free the names
|
|
::MemFree (pszUserID);
|
|
::MemFree (pszAppID);
|
|
::MemFree (pszProtID);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::GetUserResult (ULONG uReqID, PLDAP_CLIENTINFO_RES puir,
|
|
// LPTSTR szServer)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::GetUserResult (ULONG uReqID, PLDAP_CLIENTINFO_RES puir,
|
|
CIlsServer *pIlsServer)
|
|
{
|
|
CIlsUser *pu;
|
|
OBJRINFO objri;
|
|
|
|
// Default to the server's result
|
|
//
|
|
objri.hResult = (puir != NULL) ? puir->hResult : ILS_E_MEMORY;
|
|
|
|
if (SUCCEEDED(objri.hResult))
|
|
{
|
|
ASSERT (! MyIsBadServer (pIlsServer));
|
|
|
|
// The server returns CLIENTINFO, create a User object
|
|
//
|
|
pu = new CIlsUser;
|
|
|
|
if (pu != NULL)
|
|
{
|
|
objri.hResult = pu->Init(pIlsServer, &puir->lci);
|
|
if (SUCCEEDED(objri.hResult))
|
|
{
|
|
pu->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete pu;
|
|
pu = NULL;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
objri.hResult = ILS_E_MEMORY;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
pu = NULL;
|
|
};
|
|
// Package the notification info
|
|
//
|
|
objri.uReqID = uReqID;
|
|
objri.pv = (void *)(pu == NULL ? NULL : (IIlsUser *)pu);
|
|
NotifySink((void *)&objri, OnNotifyGetUserResult);
|
|
|
|
if (pu != NULL)
|
|
{
|
|
pu->Release();
|
|
};
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumUserNames (BSTR bstrServerName, IIlsFilter *pFilter,
|
|
// ULONG *puReqID)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
HRESULT CIlsMain::
|
|
EnumUsersEx (
|
|
BOOL fNameOnly,
|
|
CIlsServer *pIlsServer,
|
|
IIlsFilter *pFilter,
|
|
CAttributes *pAttrib,
|
|
ULONG *puReqID )
|
|
{
|
|
LDAP_ASYNCINFO ldai;
|
|
HRESULT hr;
|
|
|
|
// Validate parameter
|
|
//
|
|
if (::MyIsBadServer (pIlsServer) || puReqID == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Clone the server object
|
|
//
|
|
pIlsServer = ((CIlsServer *) pIlsServer)->Clone ();
|
|
if (pIlsServer == NULL)
|
|
return ILS_E_MEMORY;
|
|
|
|
// Get a list of extended attribute names
|
|
//
|
|
TCHAR *pszList = NULL;
|
|
ULONG cList =0, cbList = 0;
|
|
if (pAttrib != NULL)
|
|
{
|
|
ASSERT (!fNameOnly);
|
|
|
|
hr = pAttrib->GetAttributeList(&pszList, &cList, &cbList);
|
|
if (FAILED(hr))
|
|
{
|
|
pIlsServer->Release ();
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
// Construct default filter if needed
|
|
//
|
|
TCHAR *pszFilter = NULL;
|
|
BOOL fDefaultRenderer = FALSE;
|
|
if (pFilter == NULL)
|
|
{
|
|
// Build default filter string
|
|
//
|
|
TCHAR szLocalFilter[32];
|
|
wsprintf (&szLocalFilter[0], TEXT ("($%u=*)"), (UINT) ILS_STDATTR_USER_ID);
|
|
|
|
// Render this filter
|
|
//
|
|
hr = StringToFilter (&szLocalFilter[0], (CFilter **) &pFilter);
|
|
if (! SUCCEEDED (hr))
|
|
goto MyExit;
|
|
|
|
// Indicate we have default filter string
|
|
//
|
|
fDefaultRenderer = TRUE;
|
|
}
|
|
|
|
// Create a ldap-like filter
|
|
//
|
|
hr = ::FilterToLdapString ((CFilter *) pFilter, &pszFilter);
|
|
if (hr != S_OK)
|
|
goto MyExit;
|
|
|
|
// Enumerate users
|
|
//
|
|
hr = fNameOnly ? ::UlsLdap_EnumClients (pIlsServer->GetServerInfo (),
|
|
pszFilter,
|
|
&ldai) :
|
|
::UlsLdap_EnumClientInfos (pIlsServer->GetServerInfo (),
|
|
pszList,
|
|
cList,
|
|
pszFilter,
|
|
&ldai);
|
|
if (hr != S_OK)
|
|
goto MyExit;
|
|
|
|
// If updating server was successfully requested, wait for the response
|
|
//
|
|
COM_REQ_INFO ri;
|
|
ReqInfo_Init (&ri);
|
|
|
|
ri.uReqType = fNameOnly ? WM_ILS_ENUM_CLIENTS : WM_ILS_ENUM_CLIENTINFOS;
|
|
ri.uMsgID = ldai.uMsgID;
|
|
|
|
ReqInfo_SetMain (&ri, this);
|
|
|
|
if (! fNameOnly)
|
|
{
|
|
ReqInfo_SetServer (&ri, pIlsServer);
|
|
pIlsServer->AddRef ();
|
|
}
|
|
|
|
// Remember this request
|
|
//
|
|
hr = g_pReqMgr->NewRequest (&ri);
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
// Make sure the objects do not disappear before we get the response
|
|
//
|
|
this->AddRef ();
|
|
|
|
// Return the request ID
|
|
//
|
|
*puReqID = ri.uReqID;
|
|
}
|
|
|
|
MyExit:
|
|
|
|
// Release server object
|
|
//
|
|
pIlsServer->Release ();
|
|
|
|
// Free the filter string
|
|
//
|
|
::MemFree (pszFilter);
|
|
|
|
// Release default filter if needed
|
|
//
|
|
if (fDefaultRenderer && pFilter != NULL)
|
|
pFilter->Release ();
|
|
|
|
// Free the list of extended attribute names
|
|
//
|
|
::MemFree (pszList);
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::EnumUserNames (
|
|
IIlsServer *pIlsServer,
|
|
IIlsFilter *pFilter,
|
|
IEnumIlsNames **ppEnumUserNames,
|
|
ULONG *puReqID )
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// We do not implement synchronous operation
|
|
//
|
|
if (ppEnumUserNames != NULL)
|
|
return ILS_E_NOT_IMPL;
|
|
|
|
return EnumUsersEx (TRUE,
|
|
(CIlsServer *) pIlsServer,
|
|
pFilter,
|
|
NULL,
|
|
puReqID);
|
|
}
|
|
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumUserNamesResult (ULONG uReqID, PLDAP_ENUM ple)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::EnumUserNamesResult (ULONG uReqID, PLDAP_ENUM ple)
|
|
{
|
|
ENUMRINFO eri;
|
|
|
|
// Package the notification info
|
|
//
|
|
eri.uReqID = uReqID;
|
|
|
|
// PLDAP_ENUM is NULL when the enumeration is terminated successfully
|
|
//
|
|
if (ple != NULL)
|
|
{
|
|
eri.hResult = ple->hResult;
|
|
eri.cItems = ple->cItems;
|
|
eri.pv = (void *)(((PBYTE)ple)+ple->uOffsetItems);
|
|
}
|
|
else
|
|
{
|
|
eri.hResult = S_FALSE;
|
|
eri.cItems = 0;
|
|
eri.pv = NULL;
|
|
};
|
|
NotifySink((void *)&eri, OnNotifyEnumUserNamesResult);
|
|
return NOERROR;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumUsers (BSTR bstrServerName, IIlsFilter *pFilter,
|
|
// ULONG *puReqID)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
EnumUsers (
|
|
IIlsServer *pIlsServer,
|
|
IIlsFilter *pFilter,
|
|
IIlsAttributes *pAttrib,
|
|
IEnumIlsUsers **ppEnumUsers,
|
|
ULONG *puReqID)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// We do not implement synchronous operation
|
|
//
|
|
if (ppEnumUsers != NULL)
|
|
return ILS_E_NOT_IMPL;
|
|
|
|
return EnumUsersEx (FALSE,
|
|
(CIlsServer *) pIlsServer,
|
|
pFilter,
|
|
(CAttributes *) pAttrib,
|
|
puReqID);
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumUsersResult (ULONG uReqID, PLDAP_ENUM ple, LPTSTR szServer)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::EnumUsersResult (ULONG uReqID, PLDAP_ENUM ple, CIlsServer *pIlsServer)
|
|
{
|
|
CIlsUser **ppu;
|
|
ULONG cUsers;
|
|
ENUMRINFO eri;
|
|
HRESULT hr;
|
|
|
|
if (ple != NULL)
|
|
{
|
|
eri.hResult = ple->hResult;
|
|
cUsers = ple->cItems;
|
|
}
|
|
else
|
|
{
|
|
eri.hResult = S_FALSE;
|
|
cUsers = 0;
|
|
};
|
|
eri.uReqID = uReqID;
|
|
eri.cItems = 0;
|
|
|
|
if ((eri.hResult == NOERROR) && (cUsers != 0))
|
|
{
|
|
ASSERT (! MyIsBadServer (pIlsServer));
|
|
|
|
// Build an array of User objects here
|
|
//
|
|
ppu = (CIlsUser **) ::MemAlloc (cUsers*sizeof(CIlsUser *));
|
|
|
|
if (ppu != NULL)
|
|
{
|
|
CIlsUser *pu;
|
|
PLDAP_CLIENTINFO pui;
|
|
ULONG i;
|
|
|
|
// Build one User object at a time
|
|
//
|
|
pui = (PLDAP_CLIENTINFO)(((PBYTE)ple)+ple->uOffsetItems);
|
|
|
|
for (i = 0; i < cUsers; i++)
|
|
{
|
|
pu = new CIlsUser;
|
|
|
|
if (pu != NULL)
|
|
{
|
|
if (SUCCEEDED(pu->Init(pIlsServer, pui)))
|
|
{
|
|
pu->AddRef();
|
|
ppu[eri.cItems++] = pu;
|
|
}
|
|
else
|
|
{
|
|
delete pu;
|
|
};
|
|
};
|
|
pui++;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
eri.hResult = ILS_E_MEMORY;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
ppu = NULL;
|
|
};
|
|
|
|
// Package the notification info
|
|
//
|
|
eri.pv = (void *)ppu;
|
|
NotifySink((void *)&eri, OnNotifyEnumUsersResult);
|
|
|
|
// Free the resources
|
|
//
|
|
if (ppu != NULL)
|
|
{
|
|
for (; eri.cItems; eri.cItems--)
|
|
{
|
|
ppu[eri.cItems-1]->Release();
|
|
};
|
|
::MemFree (ppu);
|
|
};
|
|
return NOERROR;
|
|
}
|
|
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::CreateMeetingPlace (BSTR bstrMeetingPlaceID, LONG lConfType, LONG lMemberType,
|
|
// IIlsMeetingPlace **ppMeetingPlace);
|
|
//
|
|
//
|
|
// History:
|
|
//
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
STDMETHODIMP
|
|
CIlsMain::CreateMeetingPlace (
|
|
BSTR bstrMeetingPlaceID,
|
|
LONG lConfType,
|
|
LONG lMemberType,
|
|
IIlsMeetingPlace **ppMeetingPlace)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
CIlsMeetingPlace *pCcr = NULL;
|
|
HRESULT hr;
|
|
|
|
// we are just createing a place holder object which when registered
|
|
// will be visible by other users
|
|
|
|
if (ppMeetingPlace == NULL || bstrMeetingPlaceID == NULL)
|
|
{
|
|
return ILS_E_POINTER;
|
|
}
|
|
|
|
*ppMeetingPlace = NULL;
|
|
pCcr = new CIlsMeetingPlace;
|
|
|
|
if (pCcr != NULL )
|
|
{
|
|
// succeeded in createing the object
|
|
hr = pCcr->Init(bstrMeetingPlaceID, lConfType, lConfType);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
*ppMeetingPlace = (IIlsMeetingPlace *) pCcr;
|
|
(*ppMeetingPlace)->AddRef ();
|
|
}
|
|
else
|
|
{
|
|
delete pCcr;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
}
|
|
|
|
return (hr);
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::GetMeetingPlace (BSTR bstrServerName, BSTR bstrMeetingPlaceID, ULONG *puReqID)
|
|
//
|
|
// History:
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
STDMETHODIMP CIlsMain::
|
|
GetMeetingPlace (
|
|
IIlsServer *pIlsServer,
|
|
BSTR bstrMeetingPlaceID,
|
|
IIlsAttributes *pAttrib,
|
|
IIlsMeetingPlace **ppMeetingPlace,
|
|
ULONG *puReqID)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
LDAP_ASYNCINFO ldai;
|
|
LPTSTR pszMtgID = NULL;
|
|
HRESULT hr;
|
|
|
|
// We do not implement synchronous operation
|
|
//
|
|
if (ppMeetingPlace != NULL)
|
|
return ILS_E_NOT_IMPL;
|
|
|
|
// Validate parameters
|
|
//
|
|
if (::MyIsBadServer (pIlsServer) || bstrMeetingPlaceID == NULL || puReqID == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Clone the server object
|
|
//
|
|
pIlsServer = ((CIlsServer *) pIlsServer)->Clone ();
|
|
if (pIlsServer == NULL)
|
|
return ILS_E_MEMORY;
|
|
|
|
// Get a list of extended attribute names
|
|
//
|
|
TCHAR *pszList = NULL;
|
|
ULONG cList =0, cbList = 0;
|
|
if (pAttrib != NULL)
|
|
{
|
|
hr = ((CAttributes *) pAttrib)->GetAttributeList (&pszList, &cList, &cbList);
|
|
if (FAILED (hr))
|
|
{
|
|
pIlsServer->Release ();
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
// Get from the specified server
|
|
//
|
|
hr = BSTR_to_LPTSTR(&pszMtgID, bstrMeetingPlaceID);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// BUGBUG AppID not given
|
|
hr = ::UlsLdap_ResolveMeeting (((CIlsServer *) pIlsServer)->GetServerInfo (),
|
|
pszMtgID,
|
|
pszList,
|
|
cList,
|
|
&ldai);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
COM_REQ_INFO ri;
|
|
ReqInfo_Init (&ri);
|
|
|
|
// If updating server was successfully requested, wait for the response
|
|
//
|
|
ri.uReqType = WM_ILS_RESOLVE_MEETING;
|
|
ri.uMsgID = ldai.uMsgID;
|
|
|
|
ReqInfo_SetMain (&ri, this);
|
|
|
|
ReqInfo_SetServer (&ri, pIlsServer);
|
|
pIlsServer->AddRef ();
|
|
|
|
hr = g_pReqMgr->NewRequest(&ri);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Make sure the objects do not disappear before we get the response
|
|
//
|
|
this->AddRef();
|
|
|
|
// Return the request ID
|
|
//
|
|
*puReqID = ri.uReqID;
|
|
}
|
|
};
|
|
::MemFree (pszMtgID);
|
|
};
|
|
|
|
// Release the server object
|
|
//
|
|
pIlsServer->Release ();
|
|
|
|
// Free the list of extended attribute names
|
|
//
|
|
::MemFree (pszList);
|
|
|
|
return hr;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// CIlsMain::GetMeetingPlaceResult (ULONG uReqID, LDAP_MEETINFO_RES pmir,
|
|
// LPTSTR szServer)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT CIlsMain::
|
|
GetMeetingPlaceResult (ULONG uReqID, PLDAP_MEETINFO_RES pmir, CIlsServer *pIlsServer)
|
|
{
|
|
CIlsMeetingPlace *pm;
|
|
OBJRINFO objri;
|
|
|
|
// Default to the server's result
|
|
//
|
|
objri.hResult = (pmir != NULL) ? pmir->hResult : ILS_E_MEMORY;
|
|
if (SUCCEEDED (objri.hResult))
|
|
{
|
|
ASSERT (! MyIsBadServer (pIlsServer));
|
|
|
|
// The server returns CLIENTINFO, create a User object
|
|
//
|
|
pm = new CIlsMeetingPlace;
|
|
if (pm != NULL)
|
|
{
|
|
objri.hResult = pm->Init (pIlsServer, &(pmir->lmi));
|
|
if (SUCCEEDED (objri.hResult))
|
|
{
|
|
pm->AddRef();
|
|
}
|
|
else
|
|
{
|
|
delete pm;
|
|
pm = NULL;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
objri.hResult = ILS_E_MEMORY;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
pm = NULL;
|
|
};
|
|
|
|
// Package the notification info
|
|
//
|
|
objri.uReqID = uReqID;
|
|
objri.pv = (void *) (pm == NULL ? NULL : (IIlsMeetingPlace *) pm);
|
|
NotifySink ((void *) &objri, OnNotifyGetMeetingPlaceResult);
|
|
|
|
if (pm != NULL)
|
|
pm->Release();
|
|
|
|
return NOERROR;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumMeetingPlaces (BSTR bstrServerName, IIlsFilter *pFilter,
|
|
// IIlsAttributes *pAttributes, ULONG *puReqID)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT CIlsMain::
|
|
EnumMeetingPlacesEx (
|
|
BOOL fNameOnly,
|
|
CIlsServer *pIlsServer,
|
|
IIlsFilter *pFilter,
|
|
CAttributes *pAttrib,
|
|
ULONG *puReqID)
|
|
{
|
|
LDAP_ASYNCINFO ldai;
|
|
HRESULT hr;
|
|
|
|
// Validate parameter
|
|
//
|
|
if (::MyIsBadServer (pIlsServer) || puReqID == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
if (pFilter != NULL)
|
|
return ILS_E_PARAMETER;
|
|
|
|
// Clone the server object
|
|
//
|
|
pIlsServer = ((CIlsServer *) pIlsServer)->Clone ();
|
|
if (pIlsServer == NULL)
|
|
return ILS_E_MEMORY;
|
|
|
|
// Get a list of extended attribute names
|
|
//
|
|
TCHAR *pszList = NULL;
|
|
ULONG cList =0, cbList = 0;
|
|
if (pAttrib != NULL)
|
|
{
|
|
hr = ((CAttributes *) pAttrib)->GetAttributeList (&pszList, &cList, &cbList);
|
|
if (FAILED (hr))
|
|
{
|
|
pIlsServer->Release ();
|
|
return hr;
|
|
}
|
|
}
|
|
|
|
// Construct default filter if needed
|
|
//
|
|
TCHAR *pszFilter = NULL;
|
|
BOOL fDefaultRenderer = FALSE;
|
|
if (pFilter == NULL)
|
|
{
|
|
// Build default filter string
|
|
//
|
|
TCHAR szLocalFilter[256];
|
|
wsprintf (&szLocalFilter[0], TEXT ("($%u=*)"), (INT) ILS_STDATTR_MEETING_ID );
|
|
|
|
// Render this filter
|
|
//
|
|
hr = StringToFilter (&szLocalFilter[0], (CFilter **) &pFilter);
|
|
if (! SUCCEEDED (hr))
|
|
goto MyExit;
|
|
|
|
// Indicate we have default filter string
|
|
//
|
|
fDefaultRenderer = TRUE;
|
|
}
|
|
|
|
// Create a ldap-like filter
|
|
//
|
|
hr = ::FilterToLdapString ((CFilter *) pFilter, &pszFilter);
|
|
if (hr != S_OK)
|
|
goto MyExit;
|
|
|
|
// Enum meeting places
|
|
//
|
|
hr = fNameOnly ? ::UlsLdap_EnumMeetings (pIlsServer->GetServerInfo (),
|
|
pszFilter,
|
|
&ldai) :
|
|
::UlsLdap_EnumMeetingInfos (pIlsServer->GetServerInfo (),
|
|
pszList,
|
|
cList,
|
|
pszFilter,
|
|
&ldai);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
COM_REQ_INFO ri;
|
|
ReqInfo_Init (&ri);
|
|
|
|
// If updating server was successfully requested, wait for the response
|
|
//
|
|
ri.uReqType = fNameOnly ? WM_ILS_ENUM_MEETINGS : WM_ILS_ENUM_MEETINGINFOS;
|
|
ri.uMsgID = ldai.uMsgID;
|
|
|
|
ReqInfo_SetMain (&ri, this);
|
|
|
|
if (! fNameOnly)
|
|
{
|
|
ReqInfo_SetServer (&ri, pIlsServer);
|
|
pIlsServer->AddRef ();
|
|
}
|
|
|
|
hr = g_pReqMgr->NewRequest(&ri);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Make sure the objects do not disappear before we get the response
|
|
//
|
|
this->AddRef();
|
|
|
|
// Return the request ID
|
|
//
|
|
*puReqID = ri.uReqID;
|
|
};
|
|
};
|
|
|
|
MyExit:
|
|
|
|
// Free the server object
|
|
//
|
|
pIlsServer->Release ();
|
|
|
|
// Free the list of extended attribute names
|
|
//
|
|
::MemFree (pszList);
|
|
|
|
// Free the filter string
|
|
//
|
|
::MemFree (pszFilter);
|
|
|
|
// Release default filter if needed
|
|
//
|
|
if (fDefaultRenderer && pFilter != NULL)
|
|
pFilter->Release ();
|
|
|
|
return hr;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
STDMETHODIMP CIlsMain::
|
|
EnumMeetingPlaces (
|
|
IIlsServer *pServer,
|
|
IIlsFilter *pFilter,
|
|
IIlsAttributes *pAttributes,
|
|
IEnumIlsMeetingPlaces **ppEnum,
|
|
ULONG *puReqID)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// We do not implement synchronous operation
|
|
//
|
|
if (ppEnum != NULL)
|
|
return ILS_E_NOT_IMPL;
|
|
|
|
return EnumMeetingPlacesEx (FALSE,
|
|
(CIlsServer *) pServer,
|
|
pFilter,
|
|
(CAttributes *) pAttributes,
|
|
puReqID);
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// CIlsMain::EnumMeetingPlacesResult (ULONG uReqID, PLDAP_ENUM ple, LPTSTR szServer)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT
|
|
CIlsMain::EnumMeetingPlacesResult (ULONG uReqID, PLDAP_ENUM ple, CIlsServer *pIlsServer)
|
|
{
|
|
CIlsMeetingPlace **ppm;
|
|
ULONG cMeetingPlaces;
|
|
ENUMRINFO eri;
|
|
HRESULT hr;
|
|
|
|
if (ple != NULL)
|
|
{
|
|
eri.hResult = ple->hResult;
|
|
cMeetingPlaces = ple->cItems;
|
|
}
|
|
else
|
|
{
|
|
eri.hResult = S_FALSE;
|
|
cMeetingPlaces = 0;
|
|
};
|
|
eri.uReqID = uReqID;
|
|
eri.cItems = 0;
|
|
|
|
if ((eri.hResult == NOERROR) && (cMeetingPlaces != 0))
|
|
{
|
|
ASSERT (! MyIsBadServer (pIlsServer));
|
|
|
|
// Build an array of MeetingPlace objects here
|
|
//
|
|
ppm = (CIlsMeetingPlace **) ::MemAlloc (cMeetingPlaces*sizeof(CIlsMeetingPlace *));
|
|
|
|
if (ppm != NULL)
|
|
{
|
|
CIlsMeetingPlace *pm;
|
|
PLDAP_MEETINFO pmi;
|
|
ULONG i;
|
|
|
|
|
|
// Build one MeetingPlace object at a time
|
|
//
|
|
pmi = (PLDAP_MEETINFO)(((PBYTE)ple)+ple->uOffsetItems);
|
|
|
|
for (i = 0; i < cMeetingPlaces; i++)
|
|
{
|
|
pm = new CIlsMeetingPlace;
|
|
|
|
if (pm != NULL)
|
|
{
|
|
if (SUCCEEDED(pm->Init(pIlsServer, pmi)))
|
|
{
|
|
pm->AddRef();
|
|
ppm[eri.cItems++] = pm;
|
|
}
|
|
else
|
|
{
|
|
delete pm;
|
|
};
|
|
};
|
|
pmi++;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
eri.hResult = ILS_E_MEMORY;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
ppm = NULL;
|
|
};
|
|
|
|
// Package the notification info
|
|
//
|
|
eri.pv = (void *)ppm;
|
|
NotifySink((void *)&eri, OnNotifyEnumMeetingPlacesResult);
|
|
|
|
// Free the resources
|
|
//
|
|
if (ppm != NULL)
|
|
{
|
|
for (; eri.cItems; eri.cItems--)
|
|
{
|
|
ppm[eri.cItems-1]->Release();
|
|
};
|
|
::MemFree (ppm);
|
|
};
|
|
return NOERROR;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumMeetingPlaceNames (BSTR bstrServerName, IIlsFilter *pFilter,
|
|
// ULONG *puReqID)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
STDMETHODIMP CIlsMain::
|
|
EnumMeetingPlaceNames (
|
|
IIlsServer *pServer,
|
|
IIlsFilter *pFilter,
|
|
IEnumIlsNames **ppEnum,
|
|
ULONG *puReqID)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// We do not implement synchronous operation
|
|
//
|
|
if (ppEnum != NULL)
|
|
return ILS_E_NOT_IMPL;
|
|
|
|
return EnumMeetingPlacesEx (TRUE,
|
|
(CIlsServer *) pServer,
|
|
pFilter,
|
|
NULL,
|
|
puReqID);
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
|
|
//****************************************************************************
|
|
// HRESULT
|
|
// CIlsMain::EnumMeetingPlaceNamesResult (ULONG uReqID, PLDAP_ENUM ple)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
HRESULT
|
|
CIlsMain::EnumMeetingPlaceNamesResult (ULONG uReqID, PLDAP_ENUM ple)
|
|
{
|
|
ENUMRINFO eri;
|
|
|
|
// Package the notification info
|
|
//
|
|
eri.uReqID = uReqID;
|
|
|
|
// PLDAP_ENUM is NULL when the enumeration is terminated successfully
|
|
//
|
|
if (ple != NULL)
|
|
{
|
|
eri.hResult = ple->hResult;
|
|
eri.cItems = ple->cItems;
|
|
eri.pv = (void *)(((PBYTE)ple)+ple->uOffsetItems);
|
|
}
|
|
else
|
|
{
|
|
eri.hResult = S_FALSE;
|
|
eri.cItems = 0;
|
|
eri.pv = NULL;
|
|
};
|
|
NotifySink((void *)&eri, OnNotifyEnumMeetingPlaceNamesResult);
|
|
return NOERROR;
|
|
}
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::Abort (ULONG uReqID)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::Abort (ULONG uReqID)
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
COM_REQ_INFO ri;
|
|
ReqInfo_Init (&ri);
|
|
|
|
BOOL fServerReq;
|
|
HRESULT hr;
|
|
|
|
// Look for the matching request information
|
|
//
|
|
ri.uReqID = uReqID;
|
|
ri.uMsgID = 0;
|
|
hr = g_pReqMgr->GetRequestInfo(&ri);
|
|
|
|
if (FAILED(hr))
|
|
{
|
|
return ILS_E_PARAMETER;
|
|
};
|
|
|
|
// Determine the request type
|
|
//
|
|
hr = NOERROR;
|
|
switch(ri.uReqType)
|
|
{
|
|
//*************************************************************************
|
|
// Fail if it is register request.
|
|
// Cancelling register request must be done through unregister
|
|
//*************************************************************************
|
|
//
|
|
case WM_ILS_LOCAL_REGISTER:
|
|
case WM_ILS_LOCAL_UNREGISTER:
|
|
return ILS_E_FAIL;
|
|
|
|
//*************************************************************************
|
|
// These requests are parts of register, they should not be exposed to
|
|
// the caller.
|
|
//*************************************************************************
|
|
//
|
|
case WM_ILS_REGISTER_CLIENT:
|
|
case WM_ILS_UNREGISTER_CLIENT:
|
|
ASSERT(0);
|
|
break;
|
|
|
|
//*************************************************************************
|
|
// Release the objects and resources refernced or allocated for the request
|
|
// See callback.cpp for the handler in the successful response case
|
|
//*************************************************************************
|
|
//
|
|
case WM_ILS_REGISTER_PROTOCOL:
|
|
case WM_ILS_UNREGISTER_PROTOCOL:
|
|
case WM_ILS_LOCAL_REGISTER_PROTOCOL:
|
|
case WM_ILS_LOCAL_UNREGISTER_PROTOCOL:
|
|
{
|
|
CIlsUser *pUser = ReqInfo_GetUser (&ri);
|
|
if (pUser != NULL)
|
|
pUser->Release ();
|
|
|
|
CLocalProt *pProtocol = ReqInfo_GetProtocol (&ri);
|
|
if (pProtocol != NULL)
|
|
pProtocol->Release ();
|
|
}
|
|
break;
|
|
|
|
case WM_ILS_SET_CLIENT_INFO:
|
|
case WM_ILS_ENUM_PROTOCOLS:
|
|
case WM_ILS_RESOLVE_PROTOCOL:
|
|
{
|
|
CIlsUser *pUser = ReqInfo_GetUser (&ri);
|
|
if (pUser != NULL)
|
|
pUser->Release ();
|
|
}
|
|
break;
|
|
|
|
case WM_ILS_ENUM_CLIENTS:
|
|
{
|
|
CIlsMain *pMain = ReqInfo_GetMain (&ri);
|
|
if (pMain != NULL)
|
|
pMain->Release ();
|
|
}
|
|
break;
|
|
|
|
case WM_ILS_RESOLVE_CLIENT:
|
|
case WM_ILS_ENUM_CLIENTINFOS:
|
|
{
|
|
CIlsMain *pMain = ReqInfo_GetMain (&ri);
|
|
if (pMain != NULL)
|
|
pMain->Release ();
|
|
|
|
CIlsServer *pServer = ReqInfo_GetServer (&ri);
|
|
if (pServer != NULL)
|
|
pServer->Release ();
|
|
}
|
|
break;
|
|
|
|
|
|
//*************************************************************************
|
|
// Fail if it is register request.
|
|
// Cancelling register request must be done through unregister
|
|
//*************************************************************************
|
|
//
|
|
#ifdef ENABLE_MEETING_PLACE
|
|
case WM_ILS_REGISTER_MEETING:
|
|
case WM_ILS_UNREGISTER_MEETING:
|
|
return ILS_E_FAIL;
|
|
|
|
case WM_ILS_SET_MEETING_INFO:
|
|
case WM_ILS_ADD_ATTENDEE:
|
|
case WM_ILS_REMOVE_ATTENDEE:
|
|
case WM_ILS_ENUM_ATTENDEES:
|
|
{
|
|
CIlsMeetingPlace *pMeeting = ReqInfo_GetMeeting (&ri);
|
|
if (pMeeting != NULL)
|
|
pMeeting->Release ();
|
|
}
|
|
break;
|
|
|
|
case WM_ILS_RESOLVE_MEETING:
|
|
case WM_ILS_ENUM_MEETINGINFOS:
|
|
{
|
|
CIlsMain *pMain = ReqInfo_GetMain (&ri);
|
|
if (pMain != NULL)
|
|
pMain->Release ();
|
|
|
|
CIlsServer *pServer = ReqInfo_GetServer (&ri);
|
|
if (pServer != NULL)
|
|
pServer->Release ();
|
|
}
|
|
break;
|
|
|
|
case WM_ILS_ENUM_MEETINGS:
|
|
{
|
|
CIlsMain *pMain = ReqInfo_GetMain (&ri);
|
|
if (pMain != NULL)
|
|
pMain->Release ();
|
|
}
|
|
break;
|
|
#endif // ENABLE_MEETING_PLACE
|
|
|
|
default:
|
|
// Unknown request
|
|
//
|
|
ASSERT(0);
|
|
break;
|
|
};
|
|
|
|
// If it is a server request, cancel the request
|
|
//
|
|
if (ri.uMsgID != 0)
|
|
{
|
|
hr = UlsLdap_Cancel(ri.uMsgID);
|
|
};
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
// Remove the request from the queue
|
|
//
|
|
hr = g_pReqMgr->RequestDone(&ri);
|
|
};
|
|
|
|
return hr;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
|
|
{
|
|
CEnumConnectionPoints *pecp;
|
|
HRESULT hr;
|
|
|
|
// Validate parameters
|
|
//
|
|
if (ppEnum == NULL)
|
|
{
|
|
return ILS_E_POINTER;
|
|
};
|
|
|
|
// Assume failure
|
|
//
|
|
*ppEnum = NULL;
|
|
|
|
// Create an enumerator
|
|
//
|
|
pecp = new CEnumConnectionPoints;
|
|
if (pecp == NULL)
|
|
return ILS_E_MEMORY;
|
|
|
|
// Initialize the enumerator
|
|
//
|
|
hr = pecp->Init((IConnectionPoint *)pConnPt);
|
|
if (FAILED(hr))
|
|
{
|
|
delete pecp;
|
|
return hr;
|
|
};
|
|
|
|
// Give it back to the caller
|
|
//
|
|
pecp->AddRef();
|
|
*ppEnum = pecp;
|
|
return S_OK;
|
|
}
|
|
|
|
//****************************************************************************
|
|
// STDMETHODIMP
|
|
// CIlsMain::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
|
|
//
|
|
// History:
|
|
// Wed 17-Apr-1996 11:15:09 -by- Viroon Touranachun [viroont]
|
|
// Created.
|
|
//****************************************************************************
|
|
|
|
STDMETHODIMP
|
|
CIlsMain::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
|
|
{
|
|
IID siid;
|
|
HRESULT hr;
|
|
|
|
// Validate parameters
|
|
//
|
|
if (ppcp == NULL)
|
|
{
|
|
return ILS_E_POINTER;
|
|
};
|
|
|
|
// Assume failure
|
|
//
|
|
*ppcp = NULL;
|
|
|
|
if (pConnPt != NULL)
|
|
{
|
|
hr = pConnPt->GetConnectionInterface(&siid);
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (riid == siid)
|
|
{
|
|
*ppcp = (IConnectionPoint *)pConnPt;
|
|
(*ppcp)->AddRef();
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_NO_INTERFACE;
|
|
};
|
|
};
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_NO_INTERFACE;
|
|
};
|
|
|
|
return hr;
|
|
}
|
|
|
|
/* ----------------------------------------------------------------------
|
|
CIlsMain::CreateFilter
|
|
|
|
Output:
|
|
ppFilter: a placeholder for the new filter object
|
|
|
|
Input:
|
|
FilterOp: a filter operation
|
|
|
|
History:
|
|
11/12/96 Chu, Lon-Chan [lonchanc]
|
|
Created.
|
|
---------------------------------------------------------------------- */
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
CreateFilter (
|
|
ILS_FILTER_TYPE FilterType,
|
|
ILS_FILTER_OP FilterOp,
|
|
IIlsFilter **ppFilter )
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// Make sure we have valid return pointer
|
|
//
|
|
if (ppFilter == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Make sure type/op are compatible
|
|
//
|
|
HRESULT hr = S_OK;
|
|
switch (FilterType)
|
|
{
|
|
case ILS_FILTERTYPE_COMPOSITE:
|
|
// Make sure type/op are compatible
|
|
//
|
|
switch (FilterOp)
|
|
{
|
|
case ILS_FILTEROP_AND:
|
|
// Supported
|
|
//
|
|
break;
|
|
case ILS_FILTEROP_OR:
|
|
case ILS_FILTEROP_NOT:
|
|
// Not supported
|
|
//
|
|
// lonchanc: let it fail at the server side
|
|
hr = ILS_S_SERVER_MAY_NOT_SUPPORT;
|
|
break;
|
|
default:
|
|
// Invalid
|
|
//
|
|
hr = ILS_E_PARAMETER;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ILS_FILTERTYPE_SIMPLE:
|
|
// Make sure type/op are compatible
|
|
//
|
|
switch (FilterOp)
|
|
{
|
|
case ILS_FILTEROP_EQUAL:
|
|
case ILS_FILTEROP_EXIST:
|
|
case ILS_FILTEROP_LESS_THAN:
|
|
case ILS_FILTEROP_GREATER_THAN:
|
|
// Supported
|
|
//
|
|
break;
|
|
case ILS_FILTEROP_APPROX:
|
|
// Not supported
|
|
//
|
|
hr = ILS_S_SERVER_MAY_NOT_SUPPORT;
|
|
break;
|
|
default:
|
|
// Invalid
|
|
//
|
|
hr = ILS_E_PARAMETER;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
hr = ILS_E_FILTER_TYPE;
|
|
break;
|
|
}
|
|
|
|
// Create filter only if type/op are compatible
|
|
//
|
|
if (SUCCEEDED (hr))
|
|
{
|
|
CFilter *pFilter = new CFilter (FilterType);
|
|
*ppFilter = pFilter;
|
|
if (pFilter != NULL)
|
|
{
|
|
hr = S_OK;
|
|
pFilter->AddRef ();
|
|
pFilter->SetOp (FilterOp);
|
|
}
|
|
else
|
|
hr = ILS_E_MEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/* ----------------------------------------------------------------------
|
|
CIlsMain::StringToFilter
|
|
Output:
|
|
ppFilter: a placeholder for the new filter object
|
|
|
|
Input:
|
|
bstrFilterString: an LDAP-like filter string
|
|
|
|
History:
|
|
11/12/96 Chu, Lon-Chan [lonchanc]
|
|
Created.
|
|
---------------------------------------------------------------------- */
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
StringToFilter ( BSTR bstrFilterString, IIlsFilter **ppFilter )
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrFilterString == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *pszFilter = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&pszFilter, bstrFilterString);
|
|
if (hr == S_OK)
|
|
{
|
|
ASSERT (pszFilter != NULL);
|
|
|
|
// Render this filter
|
|
//
|
|
hr = StringToFilter (pszFilter, (CFilter **) ppFilter);
|
|
|
|
// Free the temporary ansi string
|
|
//
|
|
::MemFree(pszFilter);
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CIlsMain::
|
|
StringToFilter ( TCHAR *pszFilter, CFilter **ppFilter )
|
|
{
|
|
// Construct a composite filter
|
|
//
|
|
CFilterParser FilterParser;
|
|
return FilterParser.Expr (ppFilter, pszFilter);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsMain::
|
|
CreateServer ( BSTR bstrServerName, IIlsServer **ppServer )
|
|
{
|
|
// Make sure ils main is initialized
|
|
//
|
|
if (! IsInitialized ())
|
|
{
|
|
return ILS_E_NOT_INITIALIZED;
|
|
}
|
|
|
|
if (bstrServerName == NULL || ppServer == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
HRESULT hr;
|
|
CIlsServer *pIlsServer = new CIlsServer;
|
|
if (pIlsServer != NULL)
|
|
{
|
|
hr = pIlsServer->SetServerName (bstrServerName);
|
|
if (hr == S_OK)
|
|
{
|
|
pIlsServer->AddRef ();
|
|
}
|
|
else
|
|
{
|
|
delete pIlsServer;
|
|
pIlsServer = NULL;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
}
|
|
|
|
*ppServer = (IIlsServer *) pIlsServer;
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
/* ---------- server authentication object ------------ */
|
|
|
|
|
|
CIlsServer::
|
|
CIlsServer ( VOID )
|
|
:m_cRefs (0),
|
|
m_dwSignature (ILS_SERVER_SIGNATURE)
|
|
{
|
|
::ZeroMemory (&m_ServerInfo, sizeof (m_ServerInfo));
|
|
m_ServerInfo.AuthMethod = ILS_AUTH_ANONYMOUS;
|
|
}
|
|
|
|
|
|
CIlsServer::
|
|
~CIlsServer ( VOID )
|
|
{
|
|
m_dwSignature = 0;
|
|
::IlsFreeServerInfo (&m_ServerInfo);
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CIlsServer::
|
|
AddRef ( VOID )
|
|
{
|
|
DllLock();
|
|
|
|
MyDebugMsg ((DM_REFCOUNT, "CIlsServer::AddRef: ref=%ld\r\n", m_cRefs));
|
|
::InterlockedIncrement (&m_cRefs);
|
|
return m_cRefs;
|
|
}
|
|
|
|
|
|
STDMETHODIMP_(ULONG) CIlsServer::
|
|
Release ( VOID )
|
|
{
|
|
DllRelease();
|
|
|
|
ASSERT (m_cRefs > 0);
|
|
|
|
MyDebugMsg ((DM_REFCOUNT, "CIlsServer::Release: ref=%ld\r\n", m_cRefs));
|
|
if (::InterlockedDecrement (&m_cRefs) == 0)
|
|
{
|
|
delete this;
|
|
return 0;
|
|
}
|
|
return m_cRefs;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
QueryInterface ( REFIID riid, VOID **ppv )
|
|
{
|
|
*ppv = NULL;
|
|
|
|
if (riid == IID_IIlsServer || riid == IID_IUnknown)
|
|
{
|
|
*ppv = (IIlsServer *) this;
|
|
}
|
|
|
|
if (*ppv != NULL)
|
|
{
|
|
((LPUNKNOWN) *ppv)->AddRef();
|
|
return S_OK;
|
|
}
|
|
|
|
return ILS_E_NO_INTERFACE;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetAuthenticationMethod ( ILS_ENUM_AUTH_METHOD enumAuthMethod )
|
|
{
|
|
HRESULT hr;
|
|
|
|
if (ILS_AUTH_ANONYMOUS <= enumAuthMethod &&
|
|
enumAuthMethod < ILS_NUM_OF_AUTH_METHODS)
|
|
{
|
|
m_ServerInfo.AuthMethod = enumAuthMethod;
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_PARAMETER;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetLogonName ( BSTR bstrLogonName )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrLogonName == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *psz = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&psz, bstrLogonName);
|
|
if (hr == S_OK)
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszLogonName);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszLogonName = psz;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetLogonPassword ( BSTR bstrLogonPassword )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrLogonPassword == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *psz = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&psz, bstrLogonPassword);
|
|
if (hr == S_OK)
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszLogonPassword);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszLogonPassword = psz;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetDomain ( BSTR bstrDomain )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrDomain == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *psz = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&psz, bstrDomain);
|
|
if (hr == S_OK)
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszDomain);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszDomain = psz;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetCredential ( BSTR bstrCredential )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrCredential == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *psz = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&psz, bstrCredential);
|
|
if (hr == S_OK)
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszCredential);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszCredential = psz;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetTimeout ( ULONG uTimeoutInSecond )
|
|
{
|
|
m_ServerInfo.uTimeoutInSecond = uTimeoutInSecond;
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHODIMP CIlsServer::
|
|
SetBaseDN ( BSTR bstrBaseDN )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrBaseDN == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *psz = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&psz, bstrBaseDN);
|
|
if (hr == S_OK)
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszBaseDN);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszBaseDN = psz;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT CIlsServer::
|
|
SetServerName ( TCHAR *pszServerName )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (pszServerName == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// duplicate the server name
|
|
//
|
|
HRESULT hr;
|
|
TCHAR *psz = ::My_strdup (pszServerName);
|
|
if (psz != NULL)
|
|
{
|
|
if (MyIsGoodString (psz))
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszServerName);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszServerName = psz;
|
|
|
|
hr = S_OK;
|
|
}
|
|
else
|
|
{
|
|
::MemFree (psz);
|
|
psz = NULL;
|
|
hr = ILS_E_PARAMETER;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
hr = ILS_E_MEMORY;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
|
|
HRESULT CIlsServer::
|
|
SetServerName ( BSTR bstrServerName )
|
|
{
|
|
// Make sure the filter string is valid
|
|
//
|
|
if (bstrServerName == NULL)
|
|
return ILS_E_POINTER;
|
|
|
|
// Convert a bstr to an ansi string
|
|
//
|
|
TCHAR *psz = NULL;
|
|
HRESULT hr = ::BSTR_to_LPTSTR (&psz, bstrServerName);
|
|
if (hr == S_OK)
|
|
{
|
|
if (MyIsGoodString (psz))
|
|
{
|
|
// Free the old string
|
|
//
|
|
::MemFree (m_ServerInfo.pszServerName);
|
|
|
|
// Keep the new string
|
|
//
|
|
m_ServerInfo.pszServerName = psz;
|
|
}
|
|
else
|
|
{
|
|
::MemFree (psz);
|
|
psz = NULL;
|
|
hr = ILS_E_PARAMETER;
|
|
}
|
|
}
|
|
|
|
return ((psz != NULL) ? S_OK : ILS_E_MEMORY);
|
|
}
|
|
|
|
|
|
TCHAR *CIlsServer::
|
|
DuplicateServerName ( VOID )
|
|
{
|
|
return My_strdup (m_ServerInfo.pszServerName);
|
|
}
|
|
|
|
|
|
BSTR CIlsServer::
|
|
DuplicateServerNameBSTR ( VOID )
|
|
{
|
|
BSTR bstr = NULL;
|
|
TCHAR *psz = DuplicateServerName ();
|
|
if (psz != NULL)
|
|
{
|
|
LPTSTR_to_BSTR (&bstr, psz);
|
|
}
|
|
|
|
return bstr;
|
|
}
|
|
|
|
|
|
CIlsServer *CIlsServer::
|
|
Clone ( VOID )
|
|
{
|
|
CIlsServer *p = new CIlsServer;
|
|
|
|
if (p != NULL)
|
|
{
|
|
if (::IlsCopyServerInfo (p->GetServerInfo (), GetServerInfo ()) == S_OK)
|
|
{
|
|
p->AddRef ();
|
|
}
|
|
else
|
|
{
|
|
::IlsFreeServerInfo (p->GetServerInfo ());
|
|
::MemFree (p);
|
|
p = NULL;
|
|
}
|
|
}
|
|
|
|
return p;
|
|
}
|
|
|