mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3088 lines
73 KiB
3088 lines
73 KiB
//****************************************************************************
|
|
//
|
|
// 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;
|
|
}
|
|
|