WindowsXP-SP1/enduser/netmeeting/ulsldap/localusr.cpp

3089 lines
76 KiB
C++

//****************************************************************************
//
// Module: ULS.DLL
// File: localusr.cpp
// Content: This file contains the LocalUser object.
// History:
// Wed 17-Apr-1996 11:13:54 -by- Viroon Touranachun [viroont]
//
// Copyright (c) Microsoft Corporation 1996-1997
//
//****************************************************************************
#include "ulsp.h"
#include "localusr.h"
#include "localprt.h"
#include "callback.h"
#include "attribs.h"
#include "culs.h"
#define DEFAULT_COUNTRY _T("-")
#ifdef OLD
//****************************************************************************
// Registry keys and values - defined in ULSREG.H
//****************************************************************************
#define REGSTR_ILS_CLIENT_KEY ILS_REGISTRY TEXT("\\") ILS_REGFLD_CLIENT
#define REGSTR_ILS_FIRSTNAME_VALUE ILS_REGKEY_FIRST_NAME
#define REGSTR_ILS_LASTNAME_VALUE ILS_REGKEY_LAST_NAME
#define REGSTR_ILS_EMAIL_VALUE ILS_REGKEY_EMAIL_NAME
#define REGSTR_ILS_CITY_VALUE ILS_REGKEY_CITY
#define REGSTR_ILS_COUNTRY_VALUE ILS_REGKEY_COUNTRY
#define REGSTR_ILS_COMMENT_VALUE ILS_REGKEY_COMMENTS
#define REGSTR_ILS_FLAGS_VALUE ILS_REGKEY_DONT_PUBLISH
#endif //OLD
#ifdef TEST
_cdecl main()
{
return (0);
}
#endif //TEST
//****************************************************************************
// HRESULT
// OnNotifyRegisterResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT
OnNotifyRegisterResult (IUnknown *pUnk, void *pv)
{
PSRINFO psri = (PSRINFO)pv;
((IIlsUserNotify*)pUnk)->RegisterResult(psri->uReqID, psri->hResult);
return S_OK;
}
//****************************************************************************
// HRESULT
// OnNotifyUpdateUserResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT
OnNotifyUpdateResult (IUnknown *pUnk, void *pv)
{
PSRINFO psri = (PSRINFO)pv;
((IIlsUserNotify*)pUnk)->UpdateResult(psri->uReqID, psri->hResult);
return S_OK;
}
//****************************************************************************
// HRESULT
// OnNotifyProtocolChangeResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT
OnNotifyProtocolChangeResult (IUnknown *pUnk, void *pv)
{
PSRINFO psri = (PSRINFO)pv;
((IIlsUserNotify*)pUnk)->ProtocolChangeResult(psri->uReqID,
psri->hResult);
return S_OK;
}
//****************************************************************************
// HRESULT
// OnNotifyGetProtocolResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT
OnNotifyGetProtocolResult (IUnknown *pUnk, void *pv)
{
POBJRINFO pobjri = (POBJRINFO)pv;
((IIlsUserNotify*)pUnk)->GetProtocolResult(pobjri->uReqID,
(IIlsProtocol *)pobjri->pv,
pobjri->hResult);
return S_OK;
}
//****************************************************************************
// HRESULT
// OnNotifyEnumProtocolsResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT
OnNotifyEnumProtocolsResult (IUnknown *pUnk, void *pv)
{
CEnumNames *penum = NULL;
PENUMRINFO peri = (PENUMRINFO)pv;
HRESULT hr = peri->hResult;
if (SUCCEEDED(hr))
{
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
//
((IIlsUserNotify*)pUnk)->EnumProtocolsResult(peri->uReqID,
penum != NULL ?
(IEnumIlsNames *)penum :
NULL,
hr);
if (penum != NULL)
{
penum->Release();
};
return hr;
}
#ifdef MAYBE
//****************************************************************************
// HRESULT
// OnNotifyStateChanged ( IUnknown *pUnk, LONG State, VOID *pv )
//
// History:
// Thu 07-Nov-1996 13:05:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
HRESULT
CIlsUser::OnNotifyStateChanged ( IUnknown *pUnk, LONG State, BSTR bstrServerName, BOOL fPrimary )
{
// If the server object does not exist, not registered
//
if (m_pServer == NULL)
return NOERROR;
// Set server internal state
//
SetULSState ((ULSSVRSTATE) State);
// Notify the app to logoff and re-logon
// This app must NOT pop up an UI upon receiving this
//
((IIlsUserNotify *) pUnk)->StateChanged (fPrimary, bstrServerName);
return NOERROR;
}
#endif //MAYBE
HRESULT
OnNotifyStateChanged_UI_NoSuchObject ( IUnknown *pUnk, VOID *pv )
{
return ((IIlsUserNotify *)pUnk)->StateChanged (TRUE, (BSTR) pv);
}
HRESULT
OnNotifyStateChanged_NoUI_NoSuchObject ( IUnknown *pUnk, VOID *pv )
{
return ((IIlsUserNotify *)pUnk)->StateChanged (FALSE, (BSTR) pv);
}
HRESULT
OnNotifyStateChanged_UI_NetworkDown ( IUnknown *pUnk, VOID *pv )
{
return ((IIlsUserNotify *)pUnk)->StateChanged (TRUE, (BSTR) pv);
}
HRESULT
OnNotifyStateChanged_NoUI_NetworkDown ( IUnknown *pUnk, VOID *pv )
{
return ((IIlsUserNotify *)pUnk)->StateChanged (FALSE, (BSTR) pv);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::ProtocolChangeResult ( IIlsProtocol *pProtocol, ULONG uReqID, HRESULT hResult,
// APP_CHANGE_PROT uCmd)
//
//****************************************************************************
STDMETHODIMP
CIlsUser::ProtocolChangeResult ( IIlsProtocol *pProtocol, ULONG uReqID, HRESULT hResult,
APP_CHANGE_PROT uCmd)
{
SRINFO sri;
// If the server accepts the changes, modify the local information
//
if (FAILED (hResult))
{
// Update based on the command.
//
switch(uCmd)
{
case ILS_APP_ADD_PROT:
m_ProtList.Remove ((CLocalProt *) pProtocol);
pProtocol->Release (); // AddRef by RegisterLocalProtocol
break;
case ILS_APP_REMOVE_PROT:
// Release already by UnregisterLocalProtocol
break;
default:
ASSERT(0);
break;
};
}
if (uReqID) {
// Notify the sink object
//
sri.uReqID = uReqID;
sri.hResult = hResult;
hResult = NotifySink((void *)&sri, OnNotifyProtocolChangeResult);
}
#ifdef DEBUG
DPRINTF (TEXT("CIlsUser--current Protocols********************\r\n"));
DPRINTF (TEXT("\r\n*************************************************"));
#endif // DEBUG;
return hResult;
}
//****************************************************************************
// CIlsUser::CIlsUser (HANDLE hMutex)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CIlsUser::CIlsUser ()
:
m_cRef (0),
// user
m_fReadonly (FALSE),
m_uModify (LU_MOD_NONE),
m_cLock (0),
m_szID (NULL),
m_szFirstName (NULL),
m_szLastName (NULL),
m_szEMailName (NULL),
m_szCityName (NULL),
m_szCountryName (NULL),
m_szComment (NULL),
m_dwFlags (1), // default is visible
m_szIPAddr (NULL),
m_szAppName (NULL),
m_szMimeType (NULL),
m_pIlsServer (NULL),
m_pConnPt (NULL),
// server
m_uState (ULSSVR_INVALID),
m_hLdapUser (NULL),
m_pep (NULL),
m_uReqID (0),
m_uLastMsgID (0)
{
m_guid = GUID_NULL;
m_ExtendedAttrs.SetAccessType (ILS_ATTRTYPE_NAME_VALUE);
// m_szCountryName can't be a NULL string... see notes on NetMeeting 3.0 Bug 1643 for the reason why...
m_szCountryName = static_cast<LPTSTR>(MemAlloc( lstrlen( DEFAULT_COUNTRY ) + sizeof(TCHAR) ));
lstrcpy( m_szCountryName, DEFAULT_COUNTRY );
}
//****************************************************************************
// CIlsUser::~CIlsUser (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CIlsUser::~CIlsUser (void)
{
/* ------ server ------ */
// Unregister everything, including protocols
//
InternalCleanupRegistration(FALSE);
// We expect someone explicitly unregister this
//
ASSERT ((m_uState == ULSSVR_INVALID) || (m_uState == ULSSVR_INIT));
ASSERT (m_hLdapUser == NULL);
ASSERT (m_pep == NULL);
ASSERT (m_uReqID == 0);
ASSERT (m_uLastMsgID == 0);
/* ------ user ------ */
::MemFree (m_szID);
::MemFree (m_szFirstName);
::MemFree (m_szLastName);
::MemFree (m_szEMailName);
::MemFree (m_szCityName);
::MemFree (m_szCountryName);
::MemFree (m_szComment);
::MemFree (m_szIPAddr);
// Release the protocol objects
//
CLocalProt *plp = NULL;
HANDLE hEnum = NULL;
m_ProtList.Enumerate(&hEnum);
while(m_ProtList.Next (&hEnum, (PVOID *)&plp) == NOERROR)
{
plp->Release(); // AddRef by RegisterLocalProtocol or UpdateProtocol
}
m_ProtList.Flush();
// Release the buffer resources
//
::MemFree (m_szAppName);
::MemFree (m_szMimeType);
// Release the connection point
//
if (m_pConnPt != NULL)
{
m_pConnPt->ContainerReleased();
((IConnectionPoint*)m_pConnPt)->Release();
};
// Free server object
//
if (m_pIlsServer != NULL)
m_pIlsServer->Release ();
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::Clone
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
Clone ( IIlsUser **ppUser )
{
if (ppUser == NULL)
return ILS_E_POINTER;
// Create a new user object
//
CIlsUser *p = new CIlsUser;
if (p == NULL)
return ILS_E_MEMORY;
// Snap-shot the user information now
//
LDAP_CLIENTINFO *pci = NULL;
HRESULT hr = InternalGetUserInfo (TRUE, &pci, LU_MOD_ALL);
if (SUCCEEDED (hr))
{
// Fake the size to make it consistent with what Init() wants
//
pci->uSize = sizeof (*pci);
// Unpack the user information
//
hr = p->Init (NULL, pci);
}
if (FAILED (hr))
{
delete p;
p = NULL;
}
p->AddRef ();
p->m_fReadonly = FALSE;
p->m_uState = ULSSVR_INIT;
*ppUser = (IIlsUser *) p;
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::Init (BSTR bstrUserID, BSTR bstrAppName)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::Init (BSTR bstrUserID, BSTR bstrAppName)
{
HRESULT hr;
ASSERT(!m_szID && !m_szAppName);
if (!bstrUserID || !bstrAppName) {
return (ILS_E_PARAMETER);
}
hr = BSTR_to_LPTSTR(&m_szID, bstrUserID);
if (FAILED(hr)) {
m_szID = NULL; // set it to NULL for safety
return (hr);
}
hr = BSTR_to_LPTSTR(&m_szAppName, bstrAppName);
if (SUCCEEDED(hr))
{
// Make the connection point
//
m_pConnPt = new CConnectionPoint (&IID_IIlsUserNotify,
(IConnectionPointContainer *)this);
if (m_pConnPt != NULL)
{
((IConnectionPoint*)m_pConnPt)->AddRef();
hr = NOERROR;
m_ExtendedAttrs.SetAccessType (ILS_ATTRTYPE_NAME_VALUE);
}
else
{
hr = ILS_E_MEMORY;
};
};
if (FAILED(hr)) {
::MemFree (m_szID);
::MemFree (m_szAppName);
m_szID = m_szAppName = NULL;
return hr;
}
return NOERROR;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::Init (LPTSTR szServerName, PLDAP_CLIENTINFO *pui)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::Init (CIlsServer *pIlsServer, PLDAP_CLIENTINFO pui)
{
// Validate parameter
//
if ((pui->uSize != sizeof(*pui)) ||
(pui->uOffsetCN == 0) /*||
(pui->uOffsetAppName == 0)*/
)
{
return ILS_E_PARAMETER;
};
// Remember the server if necessary
//
if (pIlsServer != NULL)
{
pIlsServer->AddRef ();
}
m_pIlsServer = pIlsServer;
// Allocate strings
//
BOOL fSuccess = SUCCEEDED (SetOffsetString (&m_szID, (BYTE *) pui, pui->uOffsetCN)) && (m_szID != NULL);
fSuccess &= SUCCEEDED (SetOffsetString (&m_szAppName, (BYTE *) pui, pui->uOffsetAppName));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szFirstName, (BYTE *) pui, pui->uOffsetFirstName));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szLastName, (BYTE *) pui, pui->uOffsetLastName));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szEMailName, (BYTE *) pui, pui->uOffsetEMailName));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szCityName, (BYTE *) pui, pui->uOffsetCityName));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szCountryName, (BYTE *) pui, pui->uOffsetCountryName));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szComment, (BYTE *) pui, pui->uOffsetComment));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szIPAddr, (BYTE *) pui, pui->uOffsetIPAddress));
fSuccess &= SUCCEEDED (SetOffsetString (&m_szMimeType, (BYTE *) pui, pui->uOffsetAppMimeType));
HRESULT hr = fSuccess ? S_OK : ILS_E_MEMORY;
if (SUCCEEDED(hr))
{
// Set non-allocation data
//
m_dwFlags = pui->dwFlags;
m_guid = pui->AppGuid;
// Set extended attributes
//
m_ExtendedAttrs.SetAccessType (ILS_ATTRTYPE_NAME_VALUE);
if (pui->cAttrsReturned != 0)
{
hr = m_ExtendedAttrs.SetAttributePairs((LPTSTR)(((PBYTE)pui)+pui->uOffsetAttrsReturned),
pui->cAttrsReturned);
}
}
if (SUCCEEDED(hr))
{
// Make the connection point
//
m_pConnPt = new CConnectionPoint (&IID_IIlsUserNotify,
(IConnectionPointContainer *)this);
if (m_pConnPt != NULL)
{
((IConnectionPoint*)m_pConnPt)->AddRef();
hr = NOERROR;
m_fReadonly = TRUE;
}
else
{
hr = ILS_E_MEMORY;
};
};
// cleanup is done in destructor
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::IsWritable (BOOL *pfWriteable)
//
//****************************************************************************
STDMETHODIMP
CIlsUser::IsWritable(BOOL *pfWriteable)
{
HRESULT hr;
if (pfWriteable != NULL)
{
*pfWriteable = !m_fReadonly;
hr = S_OK;
}
else
{
hr = ILS_E_POINTER;
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::QueryInterface (REFIID riid, void **ppv)
{
*ppv = NULL;
if (riid == IID_IIlsUser || riid == IID_IUnknown)
{
*ppv = (IIlsUser *) 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)
// CIlsUser::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:14:17 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CIlsUser::AddRef (void)
{
DllLock();
MyDebugMsg ((DM_REFCOUNT, "CIlsUser::AddRef: ref=%ld\r\n", m_cRef));
::InterlockedIncrement (&m_cRef);
return (ULONG) m_cRef;
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CIlsUser::Release (void)
//
// History:
// Wed 17-Apr-1996 11:14:26 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CIlsUser::Release (void)
{
DllRelease();
ASSERT (m_cRef > 0);
MyDebugMsg ((DM_REFCOUNT, "CIlsUser::Release: ref=%ld\r\n", m_cRef));
if (::InterlockedDecrement (&m_cRef) == 0)
{
delete this;
return 0;
}
return (ULONG) m_cRef;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetStandardAttribute (ILS_STD_ATTR_NAME stdAttr, BSTR *pbstrStdAttr)
//
// History:
// 1-16-97 Shishir Pardikar
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::GetStandardAttribute(
ILS_STD_ATTR_NAME stdAttr,
BSTR *pbstrStdAttr
)
{
LPTSTR lpszAttr = NULL;
BOOL fValid = TRUE;
HRESULT hr;
if (pbstrStdAttr == NULL) {
return ILS_E_POINTER;
}
switch(stdAttr) {
case ILS_STDATTR_USER_ID:
lpszAttr = m_szID;
break;
case ILS_STDATTR_APP_NAME:
lpszAttr = m_szAppName;
break;
case ILS_STDATTR_IP_ADDRESS:
lpszAttr = m_szIPAddr;
break;
case ILS_STDATTR_EMAIL_NAME:
lpszAttr = m_szEMailName;
break;
case ILS_STDATTR_FIRST_NAME:
lpszAttr = m_szFirstName;
break;
case ILS_STDATTR_LAST_NAME:
lpszAttr = m_szLastName;
break;
case ILS_STDATTR_CITY_NAME:
lpszAttr = m_szCityName;
break;
case ILS_STDATTR_COUNTRY_NAME:
lpszAttr = m_szCountryName;
break;
case ILS_STDATTR_COMMENT:
lpszAttr = m_szComment;
break;
case ILS_STDATTR_APP_MIME_TYPE:
lpszAttr = m_szMimeType;
break;
default:
fValid = FALSE;
break;
}
if (fValid) {
if (lpszAttr){
hr = LPTSTR_to_BSTR(pbstrStdAttr, lpszAttr);
}
else {
*pbstrStdAttr = NULL;
hr = NOERROR;
}
}
else {
hr = ILS_E_PARAMETER;
}
return (hr);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::SetStandardAttribute (ILS_STD_ATTR_NAME stdAttr, BSTR bstrStdAttr)
//
// History:
// 1-16-97 Shishir Pardikar
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::SetStandardAttribute(
ILS_STD_ATTR_NAME stdAttr,
BSTR bstrStdAttr
)
{
LPTSTR *ppszAttr = NULL, pszNewAttr;
BOOL fValid = TRUE;
ULONG ulModBit = 0;
HRESULT hr;
// It is ok to have a null bstrStdAttr
//
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
switch(stdAttr) {
case ILS_STDATTR_IP_ADDRESS:
ppszAttr = &m_szIPAddr;
ulModBit = LU_MOD_IP_ADDRESS;
break;
case ILS_STDATTR_EMAIL_NAME:
ppszAttr = &m_szEMailName;
ulModBit = LU_MOD_EMAIL;
break;
case ILS_STDATTR_FIRST_NAME:
ppszAttr = &m_szFirstName;
ulModBit = LU_MOD_FIRSTNAME;
break;
case ILS_STDATTR_LAST_NAME:
ppszAttr = &m_szLastName;
ulModBit = LU_MOD_LASTNAME;
break;
case ILS_STDATTR_CITY_NAME:
ppszAttr = &m_szCityName;
ulModBit = LU_MOD_CITY;
break;
case ILS_STDATTR_COUNTRY_NAME:
ppszAttr = &m_szCountryName;
ulModBit = LU_MOD_COUNTRY;
break;
case ILS_STDATTR_COMMENT:
ppszAttr = &m_szComment;
ulModBit = LU_MOD_COMMENT;
break;
case ILS_STDATTR_APP_MIME_TYPE:
ppszAttr = &m_szMimeType;
ulModBit = LU_MOD_MIME;
break;
default:
fValid = FALSE;
break;
}
if (fValid) {
pszNewAttr = NULL;
if (bstrStdAttr == NULL || *bstrStdAttr == L'\0')
{
// pszNewAttr is null now
//
hr = S_OK;
}
else
{
// Duplicate the string
//
hr = BSTR_to_LPTSTR (&pszNewAttr, bstrStdAttr);
}
if (SUCCEEDED(hr))
{
::MemFree (*ppszAttr);
*ppszAttr = pszNewAttr;
m_uModify |= ulModBit;
}
}
else {
hr = ILS_E_PARAMETER;
}
return (hr);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetVisible ( DWORD *pfVisible )
//
// History:
// Tue 05-Nov-1996 10:30:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::GetVisible ( DWORD *pfVisible )
{
HRESULT hr = ILS_E_POINTER;
if (pfVisible != NULL)
{
*pfVisible = m_dwFlags;
hr = S_OK;
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::SetVisible ( DWORD fVisible )
//
// History:
// Tue 05-Nov-1996 10:30:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::SetVisible ( DWORD fVisible )
{
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
m_dwFlags = fVisible;
m_uModify |= LU_MOD_FLAGS;
return S_OK;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetGuid ( GUID *pGuid )
//
// History:
// Tue 05-Nov-1996 10:30:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::GetGuid ( GUID *pGuid )
{
HRESULT hr = ILS_E_POINTER;
if (pGuid != NULL)
{
*pGuid = m_guid;
hr = S_OK;
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::SetGuid ( GUID *pGuid )
//
// History:
// Tue 05-Nov-1996 10:30:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::SetGuid ( GUID *pGuid )
{
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
HRESULT hr = ILS_E_POINTER;
if (pGuid != NULL)
{
m_guid = *pGuid;
m_uModify |= LU_MOD_GUID;
hr = S_OK;
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::InternalGetUserInfo (BOOL fAddNew, PLDAP_CLIENTINFO *ppUserInfo, ULONG uFields)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::InternalGetUserInfo (BOOL fAddNew, PLDAP_CLIENTINFO *ppUserInfo, ULONG uFields)
{
PLDAP_CLIENTINFO pui;
ULONG cFName,
cLName,
cEName,
cCity,
cCountry,
cComment;
ULONG cName, cAppName, cMime;
LPTSTR szAttrs;
ULONG uOffsetDstAnyAttrs;
ULONG cAttrs, cbAttrs;
HRESULT hr;
ULONG cchIPAddr;
// Should not call this guy if nothing has been updated
//
ASSERT(uFields);
// Assume failure
//
*ppUserInfo = NULL;
// Calculate the buffer size
//
ASSERT(m_szID && m_szAppName);
cName = lstrlen(m_szID)+1;
cAppName = lstrlen(m_szAppName)+1;
cFName = (((uFields & LU_MOD_FIRSTNAME) && m_szFirstName) ? lstrlen(m_szFirstName)+1 : 0);
cLName = (((uFields & LU_MOD_LASTNAME) && m_szLastName) ? lstrlen(m_szLastName)+1 : 0);
cEName = (((uFields & LU_MOD_EMAIL)&& m_szEMailName) ? lstrlen(m_szEMailName)+1 : 0);
cCity = (((uFields & LU_MOD_CITY)&& m_szCityName) ? lstrlen(m_szCityName)+1 : 0);
cCountry=(((uFields & LU_MOD_COUNTRY)&& m_szCountryName) ? lstrlen(m_szCountryName)+1 : 0);
cComment=(((uFields & LU_MOD_COMMENT)&& m_szComment) ? lstrlen(m_szComment)+1 : 0);
cMime = (((uFields & LU_MOD_MIME)&&m_szMimeType) ? lstrlen(m_szMimeType)+1 : 0);
cchIPAddr = (((uFields & LU_MOD_IP_ADDRESS) && m_szIPAddr != NULL) ? lstrlen(m_szIPAddr)+1 : 0);
if (uFields & LU_MOD_ATTRIB) {
// Get the attribute pairs
//
hr = m_ExtendedAttrs.GetAttributePairs(&szAttrs, &cAttrs, &cbAttrs);
if (FAILED(hr))
{
return hr;
};
}
else {
cAttrs = 0;
cbAttrs = 0;
szAttrs = NULL;
}
uOffsetDstAnyAttrs = 0;
// Allocate the buffer
//
ULONG cbTotalSize = sizeof (LDAP_CLIENTINFO) +
(cName + cAppName + cFName + cLName + cEName + cchIPAddr +
cCity + cCountry + cComment + cMime+cbAttrs) * sizeof (TCHAR);
pui = (PLDAP_CLIENTINFO) ::MemAlloc (cbTotalSize);
if (pui == NULL)
{
hr = ILS_E_MEMORY;
goto bailout;
};
// Fill the structure content
//
pui->uSize = cbTotalSize;
pui->uOffsetCN = sizeof(*pui);
pui->uOffsetAppName = pui->uOffsetCN + (cName*sizeof(TCHAR));
pui->uOffsetFirstName = pui->uOffsetAppName + (cAppName*sizeof(TCHAR));
pui->uOffsetLastName = pui->uOffsetFirstName + (cFName*sizeof(TCHAR));
pui->uOffsetEMailName = pui->uOffsetLastName + (cLName*sizeof(TCHAR));
pui->uOffsetCityName = pui->uOffsetEMailName + (cEName*sizeof(TCHAR));
pui->uOffsetCountryName = pui->uOffsetCityName + (cCity*sizeof(TCHAR));
pui->uOffsetComment = pui->uOffsetCountryName + (cCountry*sizeof(TCHAR));
pui->uOffsetIPAddress = pui->uOffsetComment + (cComment * sizeof (TCHAR));
pui->uOffsetAppMimeType = pui->uOffsetIPAddress + (cchIPAddr * sizeof(TCHAR));
pui->dwFlags = m_dwFlags;
pui->AppGuid = m_guid;
// Fill in extended attributes
//
uOffsetDstAnyAttrs = (cAttrs != 0) ?
pui->uOffsetAppMimeType + (cMime*sizeof(TCHAR)) :
0;
if (fAddNew)
{
pui->cAttrsToAdd = cAttrs;
pui->uOffsetAttrsToAdd = uOffsetDstAnyAttrs;
}
else
{
pui->cAttrsToModify = cAttrs;
pui->uOffsetAttrsToModify = uOffsetDstAnyAttrs;
}
// Copy the user information
//
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetCN), m_szID);
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetAppName), m_szAppName);
if ((uFields & LU_MOD_FIRSTNAME)&&m_szFirstName)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetFirstName), m_szFirstName);
}
else
{
pui->uOffsetFirstName = 0;
};
if ((uFields & LU_MOD_LASTNAME)&&m_szLastName)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetLastName), m_szLastName);
}
else
{
pui->uOffsetLastName = 0;
};
if ((uFields & LU_MOD_EMAIL)&&m_szEMailName)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetEMailName), m_szEMailName);
}
else
{
pui->uOffsetEMailName = 0;
};
if ((uFields & LU_MOD_CITY)&&m_szCityName)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetCityName), m_szCityName);
}
else
{
pui->uOffsetCityName = 0;
};
if ((uFields & LU_MOD_COUNTRY)&&m_szCountryName)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetCountryName), m_szCountryName);
}
else
{
pui->uOffsetCountryName = 0;
};
if ((uFields & LU_MOD_COMMENT)&&m_szComment)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetComment), m_szComment);
}
else
{
pui->uOffsetComment = 0;
};
if ((uFields & LU_MOD_MIME)&&m_szMimeType)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetAppMimeType), m_szMimeType);
}
else
{
pui->uOffsetAppMimeType = 0;
}
if ((uFields & LU_MOD_IP_ADDRESS) && m_szIPAddr != NULL)
{
lstrcpy((LPTSTR)(((PBYTE)pui)+pui->uOffsetIPAddress), m_szIPAddr);
}
else
{
pui->uOffsetIPAddress = 0;
}
if (cAttrs)
{
CopyMemory(((PBYTE)pui) + uOffsetDstAnyAttrs, szAttrs, cbAttrs);
};
// Return the structure
//
*ppUserInfo = pui;
hr = NOERROR;
bailout:
if (szAttrs != NULL)
{
::MemFree (szAttrs);
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::Register (BSTR bstrServerName, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
Register (
IIlsServer *pIlsServer,
ULONG *puReqID)
{
HRESULT hr;
// Make sure it is not registered
//
if (GetULSState () != ILS_UNREGISTERED)
return ILS_E_ALREADY_REGISTERED;
// Validate parameter
//
if (::MyIsBadServer (pIlsServer) || puReqID == NULL)
return ILS_E_POINTER;
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
// Clone the server object
//
pIlsServer = ((CIlsServer *) pIlsServer)->Clone ();
if (pIlsServer == NULL)
return ILS_E_MEMORY;
// Free the old server object if necessary
//
if (m_pIlsServer != NULL)
m_pIlsServer->Release ();
// Keep the new server object
//
m_pIlsServer = (CIlsServer *) pIlsServer;
// Initialize the state
//
m_uState = ULSSVR_INIT;
// Prepare the asynchronous request
//
COM_REQ_INFO ri;
ReqInfo_Init (&ri);
ri.uReqType = WM_ILS_LOCAL_REGISTER;
ri.uMsgID = 0;
ReqInfo_SetUser (&ri, this);
// Enter the request
//
hr = g_pReqMgr->NewRequest(&ri);
if (SUCCEEDED(hr))
{
// Make sure the objects do not disappear before we get the response
//
this->AddRef();
// Register the client
//
hr = InternalRegister (ri.uReqID);
if (SUCCEEDED(hr))
{
Lock();
*puReqID = ri.uReqID;
}
else
{
// Clean up the async pending request
//
this->Release();
g_pReqMgr->RequestDone(&ri);
};
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::RegisterResult (ULONG uReqID, HRESULT hResult)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::RegisterResult (ULONG uReqID, HRESULT hResult)
{
SRINFO sri;
Unlock();
// Notify the sink object
//
sri.uReqID = uReqID;
sri.hResult = hResult;
if (hResult == S_OK)
{
m_uModify = LU_MOD_NONE;
}
hResult = NotifySink((void *)&sri, OnNotifyRegisterResult);
return hResult;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::Unregister (BSTR bstrServerName, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
Unregister ( ULONG *puReqID )
{
HRESULT hr;
// Make sure it is registered somehow (network down, need relogon, or registered)
//
if (GetULSState () == ILS_UNREGISTERED)
return ILS_E_NOT_REGISTERED;
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
// If puReqID is null, do it synchronously
//
if (puReqID == NULL)
{
hr = InternalCleanupRegistration (TRUE);
}
else
{
// Prepare the asynchronous request
//
COM_REQ_INFO ri;
ReqInfo_Init (&ri);
ri.uReqType = WM_ILS_LOCAL_UNREGISTER;
ri.uMsgID = 0;
ReqInfo_SetUser (&ri, this);
// Enter new request
//
hr = g_pReqMgr->NewRequest(&ri);
if (SUCCEEDED(hr))
{
// Make sure the objects do not disappear before we get the response
//
this->AddRef();
// Unregister the application
//
hr = InternalUnregister (ri.uReqID);
if (SUCCEEDED(hr))
{
Lock();
*puReqID = ri.uReqID;
}
else
{
// Clean up the async pending request
//
this->Release();
g_pReqMgr->RequestDone(&ri);
};
};
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::UnregisterResult (ULONG uReqID, HRESULT hResult)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::UnregisterResult (ULONG uReqID, HRESULT hResult)
{
SRINFO sri;
Unlock();
// Notify the sink object
//
sri.uReqID = uReqID;
sri.hResult = hResult;
hResult = NotifySink((void *)&sri, OnNotifyRegisterResult);
return hResult;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::Update(ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
Update ( ULONG *puReqID )
{
PLDAP_CLIENTINFO pUserInfo;
LDAP_ASYNCINFO ldai;
ULONG uReqID;
HRESULT hr;
if (GetULSState () != ILS_REGISTERED)
return ILS_E_NOT_REGISTERED;
if (puReqID == NULL)
return ILS_E_POINTER;
// We already registered with the server.
// Get the user information
//
hr = (m_uModify == LU_MOD_NONE) ?
S_FALSE :
InternalGetUserInfo (FALSE, &pUserInfo, m_uModify);
if (hr == NOERROR)
{
// Make sure that we do not update User ID and App Name
//
pUserInfo->uOffsetCN = INVALID_OFFSET;
pUserInfo->uOffsetAppName = INVALID_OFFSET;
// Some fields have been updated, notify the server first
//
hr = ::UlsLdap_SetClientInfo (m_hLdapUser, pUserInfo, &ldai);
::MemFree (pUserInfo);
// If updating server was successfully requested, wait for the response
//
COM_REQ_INFO ri;
ReqInfo_Init (&ri);
ri.uReqType = WM_ILS_SET_CLIENT_INFO;
ri.uMsgID = ldai.uMsgID;
ReqInfo_SetUser (&ri, this);
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;
Lock();
};
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::UpdateResult (ULONG uReqID, HRESULT hResult)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::UpdateResult (ULONG uReqID,
HRESULT hResult)
{
SRINFO sri;
Unlock ();
// Notify the sink object
//
sri.uReqID = uReqID;
sri.hResult = hResult;
if (hResult == S_OK)
{
m_uModify = LU_MOD_NONE;
}
hResult = NotifySink((void *)&sri, OnNotifyUpdateResult);
return hResult;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetProtocolHandle (CLocalProt *pLocalProt, PHANDLE phProt)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT CIlsUser::
GetProtocolHandle (CLocalProt *pLocalProt, PHANDLE phProt)
{
ASSERT (pLocalProt != NULL);
ASSERT (phProt != NULL);
// Cannot retreive the handle if ULS is locked, i.e. registering something
//
if (IsLocked())
return ILS_E_FAIL;
/* ------ server ------ */
if (m_uState != ULSSVR_CONNECT)
return ILS_E_FAIL;
// Find the matching protocol
//
*phProt = pLocalProt->GetProviderHandle ();
return S_OK;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::RegisterLocalProtocol (BOOL fAddToList, CLocalProt *plp, PLDAP_ASYNCINFO plai)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT CIlsUser::
RegisterLocalProtocol ( BOOL fAddToList, CLocalProt *plp, PLDAP_ASYNCINFO plai )
{
ASSERT (plp != NULL);
ASSERT (plai != NULL);
// Let's register the protocol now
//
ASSERT (m_hLdapUser != NULL);
PLDAP_PROTINFO ppi = NULL;
HRESULT hr = plp->GetProtocolInfo(&ppi);
if (SUCCEEDED(hr))
{
// Remember the protocol to register
//
if (fAddToList)
{
plp->AddRef ();
hr = m_ProtList.Insert(plp);
}
if (SUCCEEDED(hr))
{
HANDLE hProt = NULL;
hr = ::UlsLdap_RegisterProtocol (m_hLdapUser, ppi, &hProt, plai);
plp->SetProviderHandle (hProt);
if (FAILED(hr) && fAddToList)
{
m_ProtList.Remove(plp);
};
};
if (FAILED (hr) && fAddToList)
{
plp->Release ();
};
::MemFree (ppi);
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::UnregisterLocalProtocol (CLocalProt *plp, PLDAP_ASYNCINFO plai)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT CIlsUser::
UnregisterLocalProtocol (CLocalProt *plp, PLDAP_ASYNCINFO plai)
{
ASSERT (plp != NULL);
ASSERT (plai != NULL);
// Cannot retreive the handle if ULS is locked, i.e. registering something
//
if (IsLocked())
return ILS_E_FAIL;
// Must be registered to perform this operation
//
HRESULT hr;
ILS_STATE uULSState = GetULSState ();
if (uULSState == ILS_REGISTERED ||
uULSState == ILS_REGISTERED_BUT_INVALID ||
uULSState == ILS_NETWORK_DOWN)
{
// Search for the protocol
//
if (m_ProtList.Remove (plp) == S_OK)
{
ASSERT (plp != NULL);
// Another protocol to unregister
//
hr = ::UlsLdap_UnRegisterProtocol (plp->GetProviderHandle (), plai);
plp->Release (); // AddRef by RegisterLocalProtocol
}
else
{
hr = S_FALSE;
};
}
else
{
hr = ILS_E_FAIL;
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetState (BSTR bstrServerName, ULSSTATE *puULSState)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
GetState ( ILS_STATE *puULSState )
{
HRESULT hr;
if (puULSState != NULL)
{
*puULSState = GetULSState ();
hr = S_OK;
}
else
{
hr = ILS_E_POINTER;
}
return hr;
}
//****************************************************************************
// CEnumUsers::CEnumUsers (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumUsers::CEnumUsers (void)
{
m_cRef = 0;
m_ppu = NULL;
m_cUsers = 0;
m_iNext = 0;
return;
}
//****************************************************************************
// CEnumUsers::~CEnumUsers (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumUsers::~CEnumUsers (void)
{
ULONG i;
if (m_ppu != NULL)
{
for (i = 0; i < m_cUsers; i++)
{
m_ppu[i]->Release();
};
::MemFree (m_ppu);
};
return;
}
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Init (CIlsUser **ppuList, ULONG cUsers)
//
// History:
// Wed 17-Apr-1996 11:15:25 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumUsers::Init (CIlsUser **ppuList, ULONG cUsers)
{
HRESULT hr = NOERROR;
// If no list, do nothing
//
if (cUsers != 0)
{
ASSERT(ppuList != NULL);
// Allocate the snapshot buffer
//
m_ppu = (CIlsUser **) ::MemAlloc (cUsers*sizeof(CIlsUser *));
if (m_ppu != NULL)
{
ULONG i;
// Snapshot the object list
//
for (i =0; i < cUsers; i++)
{
m_ppu[i] = ppuList[i];
m_ppu[i]->AddRef();
};
this->m_cUsers = cUsers;
}
else
{
hr = ILS_E_MEMORY;
};
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:15:31 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumUsers::QueryInterface (REFIID riid, void **ppv)
{
if (riid == IID_IEnumIlsUsers || riid == IID_IUnknown)
{
*ppv = (IEnumIlsUsers *) this;
AddRef();
return S_OK;
}
else
{
*ppv = NULL;
return ILS_E_NO_INTERFACE;
};
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumUsers::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:15:37 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CEnumUsers::AddRef (void)
{
DllLock();
MyDebugMsg ((DM_REFCOUNT, "CEnumUsers::AddRef: ref=%ld\r\n", m_cRef));
::InterlockedIncrement (&m_cRef);
return m_cRef;
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumUsers::Release (void)
//
// History:
// Wed 17-Apr-1996 11:15:43 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CEnumUsers::Release (void)
{
DllRelease();
ASSERT (m_cRef > 0);
MyDebugMsg ((DM_REFCOUNT, "CEnumUsers::Release: ref=%ld\r\n", m_cRef));
if (::InterlockedDecrement (&m_cRef) == 0)
{
delete this;
return 0;
}
return m_cRef;
}
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Next (ULONG cUsers, IIlsUser **rgpu, ULONG *pcFetched)
//
// History:
// Wed 17-Apr-1996 11:15:49 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumUsers::Next (ULONG cUsers, IIlsUser **rgpu, ULONG *pcFetched)
{
ULONG cCopied;
HRESULT hr;
// Validate the pointer
//
if (rgpu == NULL)
return E_POINTER;
// Validate the parameters
//
if ((cUsers == 0) ||
((cUsers > 1) && (pcFetched == NULL)))
return ILS_E_PARAMETER;
// Check the enumeration index
//
cCopied = 0;
// Can copy if we still have more attribute names
//
while ((cCopied < cUsers) &&
(m_iNext < this->m_cUsers))
{
m_ppu[m_iNext]->AddRef();
rgpu[cCopied++] = m_ppu[m_iNext++];
};
// Determine the returned information based on other parameters
//
if (pcFetched != NULL)
{
*pcFetched = cCopied;
};
return (cUsers == cCopied ? S_OK : S_FALSE);
}
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Skip (ULONG cUsers)
//
// History:
// Wed 17-Apr-1996 11:15:56 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumUsers::Skip (ULONG cUsers)
{
ULONG iNewIndex;
// Validate the parameters
//
if (cUsers == 0)
return ILS_E_PARAMETER;
// Check the enumeration index limit
//
iNewIndex = m_iNext+cUsers;
if (iNewIndex <= this->m_cUsers)
{
m_iNext = iNewIndex;
return S_OK;
}
else
{
m_iNext = this->m_cUsers;
return S_FALSE;
};
}
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Reset (void)
//
// History:
// Wed 17-Apr-1996 11:16:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumUsers::Reset (void)
{
m_iNext = 0;
return S_OK;
}
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Clone(IEnumIlsUsers **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:16:11 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumUsers::Clone(IEnumIlsUsers **ppEnum)
{
CEnumUsers *peu;
HRESULT hr;
// Validate parameters
//
if (ppEnum == NULL)
{
return E_POINTER;
};
*ppEnum = NULL;
// Create an enumerator
//
peu = new CEnumUsers;
if (peu == NULL)
return ILS_E_MEMORY;
// Clone the information
//
hr = peu->Init(m_ppu, m_cUsers);
if (SUCCEEDED(hr))
{
peu->m_iNext = m_iNext;
// Return the cloned enumerator
//
peu->AddRef();
*ppEnum = peu;
}
else
{
delete peu;
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::SetExtendedAttributes (IIlsAttributes *pAttributes, ULONG *puReqID)
//
// History:
//****************************************************************************
STDMETHODIMP CIlsUser::
SetExtendedAttribute ( BSTR bstrName, BSTR bstrValue )
{
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
m_uModify |= LU_MOD_ATTRIB;
return m_ExtendedAttrs.SetAttribute (bstrName, bstrValue);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::RemoveExtendedAttributes (IIlsAttributes *pAttributes, ULONG *puReqID)
//
// History:
//****************************************************************************
STDMETHODIMP CIlsUser::
RemoveExtendedAttribute ( BSTR bstrName )
{
// Make sure this is not a read-only object
//
if (m_fReadonly)
return ILS_E_ACCESS_DENIED;
m_uModify |= LU_MOD_ATTRIB;
return m_ExtendedAttrs.SetAttribute (bstrName, NULL);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetExtendedAttributes (IIlsAttributes **pAttributes)
//
//****************************************************************************
STDMETHODIMP CIlsUser::
GetExtendedAttribute ( BSTR bstrName, BSTR *pbstrValue )
{
return m_ExtendedAttrs.GetAttribute (bstrName, pbstrValue);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetAllExtendedAttributes (IIlsAttributes **pAttributes)
//
//****************************************************************************
STDMETHODIMP CIlsUser::
GetAllExtendedAttributes ( IIlsAttributes **ppAttributes )
{
if (ppAttributes == NULL)
return ILS_E_PARAMETER;
return m_ExtendedAttrs.CloneNameValueAttrib((CAttributes **) ppAttributes);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::CreateProtocol(
// BSTR bstrProtocolID,
// ULONG uPortNumber,
// BSTR bstrMimeType,
// IIlsProtocol **ppProtocol)
//****************************************************************************
STDMETHODIMP
CIlsUser::CreateProtocol(
BSTR bstrProtocolID,
ULONG uPortNumber,
BSTR bstrMimeType,
IIlsProtocol **ppProtocol)
{
HRESULT hr= NOERROR;
CLocalProt *pProt;
if (!ppProtocol) {
return (ILS_E_POINTER);
}
*ppProtocol = NULL;
pProt = new CLocalProt;
if (!pProt) {
return ILS_E_MEMORY;
}
hr = pProt->Init(bstrProtocolID, uPortNumber, bstrMimeType);
if (SUCCEEDED(hr)) {
pProt->QueryInterface(IID_IIlsProtocol, (void **)ppProtocol);
}
else {
delete pProt;
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::UpdateProtocol (IIlsProtocol *pProtocol,
// ULONG *puReqID, APP_CHANGE_PROT uCmd)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT CIlsUser::
UpdateProtocol (
IIlsProtocol *pProtocol,
ULONG *puReqID,
APP_CHANGE_PROT uCmd)
{
ASSERT (uCmd == ILS_APP_ADD_PROT || uCmd == ILS_APP_REMOVE_PROT);
// Validate parameters
//
if (pProtocol == NULL || puReqID == NULL)
return ILS_E_POINTER;
HRESULT hr;
HANDLE hLdapApp;
LDAP_ASYNCINFO ldai;
// Check whether the protocol exists
//
CLocalProt *plp = NULL;
HANDLE hEnum = NULL;
m_ProtList.Enumerate(&hEnum);
while(m_ProtList.Next(&hEnum, (VOID **)&plp) == NOERROR)
{
ASSERT (plp != NULL);
if (plp->IsSameAs((CLocalProt *)pProtocol) == NOERROR)
{
break;
};
plp = NULL;
};
if (plp != NULL)
{
// The protocol exists, fail if this add request
//
if (uCmd == ILS_APP_ADD_PROT)
{
return ILS_E_PARAMETER;
};
}
else
{
// The protocol does not exist, fail if this remove request
//
if (uCmd == ILS_APP_REMOVE_PROT)
{
return ILS_E_PARAMETER;
};
};
// Make sure we are not in the middle of registration/unregistration.
//
if (IsLocked ())
return ILS_E_FAIL;
// Must be registered to perform this operation
//
ILS_STATE uULSState = GetULSState ();
if (uULSState == ILS_REGISTERED)
{
// Update the server information first
//
switch (uCmd)
{
case ILS_APP_ADD_PROT:
hr = RegisterLocalProtocol(TRUE, (CLocalProt*)pProtocol, &ldai);
break;
case ILS_APP_REMOVE_PROT:
hr = UnregisterLocalProtocol((CLocalProt*)pProtocol, &ldai);
break;
};
switch (hr)
{
case NOERROR:
//
// Server starts updating the protocol successfullly
// We will wait for the server response.
//
break;
default:
// ULS is locked. Return failure.
//
hr = ILS_E_ABORT;
break;
}
if (SUCCEEDED(hr))
{
ASSERT(ldai.uMsgID);
ULONG uMsg;
switch(uCmd)
{
case ILS_APP_ADD_PROT:
uMsg = WM_ILS_REGISTER_PROTOCOL;
break;
case ILS_APP_REMOVE_PROT:
uMsg = WM_ILS_UNREGISTER_PROTOCOL;
break;
default:
ASSERT(0);
uCmd = ILS_APP_ADD_PROT;
break;
};
COM_REQ_INFO ri;
ReqInfo_Init (&ri);
ri.uReqType = uMsg;
ri.uMsgID = ldai.uMsgID;
ReqInfo_SetUser (&ri, this);
ReqInfo_SetProtocol (&ri, pProtocol);
hr = g_pReqMgr->NewRequest(&ri);
if (SUCCEEDED(hr))
{
// Make sure the objects do not disappear before we get the response
//
this->AddRef();
pProtocol->AddRef();
// Return the request ID
//
*puReqID = ri.uReqID;
}
}
}
else
{
// Just make local change
//
switch (uCmd)
{
case ILS_APP_ADD_PROT:
pProtocol->AddRef ();
hr = m_ProtList.Insert ((CLocalProt*)pProtocol);
break;
case ILS_APP_REMOVE_PROT:
ASSERT (plp != NULL && plp->IsSameAs((CLocalProt *)pProtocol) == S_OK);
if (plp != NULL)
{
hr = m_ProtList.Remove (plp);
if (hr == S_OK)
{
// The protocol object really exists in ths list
//
plp->Release (); // AddRef by above case
}
}
break;
};
*puReqID = 0;
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::AddProtocol (IIlsProtocol *pProtocol,
// ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
AddProtocol (IIlsProtocol *pProtocol, ULONG *puReqID)
{
return UpdateProtocol (pProtocol, puReqID, ILS_APP_ADD_PROT);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::RemoveProtocol (IIlsProtocol *pProtocol,
// ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
RemoveProtocol ( IIlsProtocol *pProtocol, ULONG *puReqID )
{
return UpdateProtocol (pProtocol, puReqID, ILS_APP_REMOVE_PROT);
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::EnumProtocols (IEnumIlsProtocols **ppEnumProtocol)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT
CIlsUser::EnumLocalProtocols (IEnumIlsProtocols **ppEnumProtocol)
{
CEnumProtocols *pep;
HRESULT hr;
// Validate parameters
//
if (ppEnumProtocol == NULL)
{
return ILS_E_POINTER;
};
// Assume failure
//
*ppEnumProtocol = NULL;
// Create a peer enumerator
//
pep = new CEnumProtocols;
if (pep != NULL)
{
hr = pep->Init(&m_ProtList);
if (SUCCEEDED(hr))
{
// Get the enumerator interface
//
pep->AddRef();
*ppEnumProtocol = pep;
}
else
{
delete pep;
};
}
else
{
hr = ILS_E_MEMORY;
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::EnumProtocols(
// IIlsFilter *pFilter,
// IIlsAttributes *pAttributes,
// IEnumIlsProtocols **pEnumProtocol,
// ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::EnumProtocols(
IIlsFilter *pFilter,
IIlsAttributes *pAttributes,
IEnumIlsProtocols **ppEnumProtocol,
ULONG *puReqID)
{
LDAP_ASYNCINFO ldai;
HRESULT hr=ILS_E_FAIL;
// Validate parameter
//
if (puReqID == NULL)
{
return ILS_E_POINTER;
};
// We do not implement synchronous operation
//
if (ppEnumProtocol != NULL)
return ILS_E_NOT_IMPL;
if (m_fReadonly)
{
hr = ::UlsLdap_EnumProtocols (m_pIlsServer->GetServerInfo (), m_szID, m_szAppName, &ldai);
}
else
{
return ILS_E_ACCESS_DENIED;
}
if (SUCCEEDED(hr))
{
COM_REQ_INFO ri;
ReqInfo_Init (&ri);
// If updating server was successfully requested, wait for the response
//
ri.uReqType = WM_ILS_ENUM_PROTOCOLS;
ri.uMsgID = ldai.uMsgID;
ReqInfo_SetUser (&ri, this);
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;
};
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetProtocol (BSTR bstrProtocolID, IIlsAttributes *pAttributes,
// IIlsProtocol **ppProtocol, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CIlsUser::
GetProtocol (
BSTR bstrProtocolID,
IIlsAttributes *pAttributes,
IIlsProtocol **ppProtocol,
ULONG *puReqID )
{
LDAP_ASYNCINFO ldai;
LPTSTR pszID;
HRESULT hr;
TCHAR *pszAttrNameList = NULL;
ULONG cAttrNames = 0;
ULONG cbNames = 0;
// Validate parameter
//
if (bstrProtocolID == NULL || puReqID == NULL)
return ILS_E_POINTER;
// Make sure this is a read-only object from server
//
if (! m_fReadonly)
return ILS_E_ACCESS_DENIED;
// Make sure we have a valid server object
//
if (m_pIlsServer == NULL)
return ILS_E_FAIL;
// Convert protocol name
//
hr = BSTR_to_LPTSTR(&pszID, bstrProtocolID);
if (hr != S_OK)
return hr;
// Get arbitrary attribute name list if any
//
if (pAttributes != NULL)
{
hr = ((CAttributes *) pAttributes)->GetAttributeList (&pszAttrNameList, &cAttrNames, &cbNames);
if (hr != S_OK)
goto MyExit;
}
hr = ::UlsLdap_ResolveProtocol (m_pIlsServer->GetServerInfo (),
m_szID,
m_szAppName,
pszID,
pszAttrNameList,
cAttrNames,
&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 = WM_ILS_RESOLVE_PROTOCOL;
ri.uMsgID = ldai.uMsgID;
ReqInfo_SetUser (&ri, this);
// Remember this request
//
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:
::MemFree(pszAttrNameList);
::MemFree (pszID);
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::EnumProtocolsResult (ULONG uReqID, PLDAP_ENUM ple)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::EnumProtocolsResult (ULONG uReqID, PLDAP_ENUM ple)
{
ENUMRINFO eri;
// Package the notification info
//
eri.uReqID = uReqID;
if (ple != NULL)
{
eri.hResult = ple->hResult;
eri.cItems = ple->cItems;
eri.pv = (void *)(((PBYTE)ple)+ple->uOffsetItems);
}
else
{
eri.hResult = ILS_E_MEMORY;
eri.cItems = 0;
eri.pv = NULL;
}
NotifySink((void *)&eri, OnNotifyEnumProtocolsResult);
return NOERROR;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::StateChanged ( BOOL fPrimary, TCHAR *pszServerName )
//
// History:
// Thu 07-Nov-1996 12:52:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::StateChanged ( LONG Type, BOOL fPrimary )
{
BSTR bstrServerName;
HRESULT hr;
if (m_pIlsServer != NULL)
{
bstrServerName = m_pIlsServer->DuplicateServerNameBSTR ();
}
else
{
bstrServerName = NULL;
ASSERT (FALSE);
}
switch (Type)
{
case WM_ILS_CLIENT_NEED_RELOGON:
SetULSState(ULSSVR_RELOGON);
hr = NotifySink (bstrServerName, fPrimary ?
OnNotifyStateChanged_UI_NoSuchObject :
OnNotifyStateChanged_NoUI_NoSuchObject);
break;
case WM_ILS_CLIENT_NETWORK_DOWN:
SetULSState(ULSSVR_NETWORK_DOWN);
hr = NotifySink (bstrServerName, fPrimary ?
OnNotifyStateChanged_UI_NetworkDown :
OnNotifyStateChanged_NoUI_NetworkDown);
break;
}
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::GetProtocolResult (ULONG uReqID, PLDAP_PROTINFO_RES ppir)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::GetProtocolResult (ULONG uReqID, PLDAP_PROTINFO_RES ppir)
{
CLocalProt *pp;
OBJRINFO objri;
// Default to the server's result
//
objri.hResult = (ppir != NULL) ? ppir->hResult : ILS_E_MEMORY;
if (SUCCEEDED(objri.hResult))
{
// The server returns PROTINFO, create a Application object
//
pp = new CLocalProt;
if (pp != NULL)
{
objri.hResult = pp->Init(m_pIlsServer, m_szID, m_szAppName, &ppir->lpi);
if (SUCCEEDED(objri.hResult))
{
pp->AddRef();
}
else
{
delete pp;
pp = NULL;
};
}
else
{
objri.hResult = ILS_E_MEMORY;
};
}
else
{
pp = NULL;
};
// Package the notification info
//
objri.uReqID = uReqID;
objri.pv = (void *)(pp == NULL ? NULL : (IIlsProtocol *)pp);
NotifySink((void *)&objri, OnNotifyGetProtocolResult);
if (pp != NULL)
{
pp->Release();
};
return NOERROR;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
{
HRESULT hr = S_OK;
if (m_pConnPt != NULL)
{
hr = m_pConnPt->Notify(pv, pfn);
};
return hr;
}
//****************************************************************************
// CEnumProtocols::CEnumProtocols (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumProtocols::CEnumProtocols (void)
{
m_cRef = 0;
hEnum = NULL;
return;
}
//****************************************************************************
// CEnumProtocols::~CEnumProtocols (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumProtocols::~CEnumProtocols (void)
{
CLocalProt *plp;
ASSERT (m_cRef == 0);
m_ProtList.Enumerate(&hEnum);
while(m_ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR)
{
plp->Release();
};
m_ProtList.Flush();
return;
}
//****************************************************************************
// STDMETHODIMP
// CEnumProtocols::Init (CList *pProtList)
//
// History:
// Wed 17-Apr-1996 11:15:25 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumProtocols::Init (CList *pProtList)
{
CLocalProt *plp;
HRESULT hr;
// Duplicate the protocol list
//
hr = m_ProtList.Clone (pProtList, NULL);
if (SUCCEEDED(hr))
{
// Add reference to each protocol object
//
m_ProtList.Enumerate(&hEnum);
while(m_ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR)
{
plp->AddRef();
};
// Reset the enumerator
//
m_ProtList.Enumerate(&hEnum);
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CEnumProtocols::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:15:31 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumProtocols::QueryInterface (REFIID riid, void **ppv)
{
if (riid == IID_IEnumIlsProtocols || riid == IID_IUnknown)
{
*ppv = (IEnumIlsProtocols *) this;
AddRef();
return S_OK;
}
else
{
*ppv = NULL;
return ILS_E_NO_INTERFACE;
};
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumProtocols::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:15:37 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CEnumProtocols::AddRef (void)
{
DllLock();
MyDebugMsg ((DM_REFCOUNT, "CEnumProtocols::AddRef: ref=%ld\r\n", m_cRef));
::InterlockedIncrement (&m_cRef);
return (ULONG) m_cRef;
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumProtocols::Release (void)
//
// History:
// Wed 17-Apr-1996 11:15:43 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CEnumProtocols::Release (void)
{
DllRelease();
ASSERT (m_cRef > 0);
MyDebugMsg ((DM_REFCOUNT, "CEnumProtocols::Release: ref=%ld\r\n", m_cRef));
if (::InterlockedDecrement (&m_cRef) == 0)
{
delete this;
return 0;
}
return (ULONG) m_cRef;
}
//****************************************************************************
// STDMETHODIMP
// CEnumProtocols::Next (ULONG cProtocols,
// IIlsProtocol **rgpProt,
// ULONG *pcFetched)
//
// History:
// Wed 17-Apr-1996 11:15:49 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumProtocols::Next (ULONG cProtocols, IIlsProtocol **rgpProt,
ULONG *pcFetched)
{
CLocalProt *plp;
ULONG cCopied;
HRESULT hr;
// Validate the pointer
//
if (rgpProt == NULL)
return ILS_E_POINTER;
// Validate the parameters
//
if ((cProtocols == 0) ||
((cProtocols > 1) && (pcFetched == NULL)))
return ILS_E_PARAMETER;
// Check the enumeration index
//
cCopied = 0;
// Can copy if we still have more protocols
//
while ((cCopied < cProtocols) &&
(m_ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR))
{
rgpProt[cCopied] = plp;
plp->AddRef();
cCopied++;
};
// Determine the returned information based on other parameters
//
if (pcFetched != NULL)
{
*pcFetched = cCopied;
};
return (cProtocols == cCopied ? S_OK : S_FALSE);
}
//****************************************************************************
// STDMETHODIMP
// CEnumProtocols::Skip (ULONG cProtocols)
//
// History:
// Wed 17-Apr-1996 11:15:56 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumProtocols::Skip (ULONG cProtocols)
{
CLocalProt *plp;
ULONG cSkipped;
// Validate the parameters
//
if (cProtocols == 0)
return ILS_E_PARAMETER;
// Check the enumeration index limit
//
cSkipped = 0;
// Can skip only if we still have more attributes
//
while ((cSkipped < cProtocols) &&
(m_ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR))
{
cSkipped++;
};
return (cProtocols == cSkipped ? S_OK : S_FALSE);
}
//****************************************************************************
// STDMETHODIMP
// CEnumProtocols::Reset (void)
//
// History:
// Wed 17-Apr-1996 11:16:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumProtocols::Reset (void)
{
m_ProtList.Enumerate(&hEnum);
return S_OK;
}
//****************************************************************************
// STDMETHODIMP
// CEnumProtocols::Clone(IEnumIlsProtocols **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:16:11 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CEnumProtocols::Clone(IEnumIlsProtocols **ppEnum)
{
CEnumProtocols *pep;
HRESULT hr;
// Validate parameters
//
if (ppEnum == NULL)
{
return ILS_E_POINTER;
};
*ppEnum = NULL;
// Create an enumerator
//
pep = new CEnumProtocols;
if (pep == NULL)
return ILS_E_MEMORY;
// Clone the information
//
pep->hEnum = hEnum;
hr = pep->m_ProtList.Clone (&m_ProtList, &(pep->hEnum));
if (SUCCEEDED(hr))
{
CLocalProt *plp;
HANDLE hEnumTemp;
// Add reference to each protocol object
//
pep->m_ProtList.Enumerate(&hEnumTemp);
while(pep->m_ProtList.Next(&hEnumTemp, (PVOID *)&plp) == NOERROR)
{
plp->AddRef();
};
// Return the cloned enumerator
//
pep->AddRef();
*ppEnum = pep;
}
else
{
delete pep;
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
{
CEnumConnectionPoints *pecp;
HRESULT hr;
// Validate parameters
//
if (ppEnum == NULL)
{
return 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 *)m_pConnPt);
if (FAILED(hr))
{
delete pecp;
return hr;
};
// Give it back to the caller
//
pecp->AddRef();
*ppEnum = pecp;
return S_OK;
}
//****************************************************************************
// STDMETHODIMP
// CIlsUser::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
//
// History:
// Wed 17-Apr-1996 11:15:09 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CIlsUser::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
{
IID siid;
HRESULT hr;
// Validate parameters
//
if (ppcp == NULL)
{
return E_POINTER;
};
// Assume failure
//
*ppcp = NULL;
if (m_pConnPt != NULL)
{
hr = m_pConnPt->GetConnectionInterface(&siid);
if (SUCCEEDED(hr))
{
if (riid == siid)
{
*ppcp = (IConnectionPoint *)m_pConnPt;
(*ppcp)->AddRef();
hr = S_OK;
}
else
{
hr = ILS_E_NO_INTERFACE;
};
};
}
else
{
hr = ILS_E_NO_INTERFACE;
};
return hr;
}