|
|
//****************************************************************************
//
// Module: ULS.DLL
// File: ulsuser.cpp
// Content: This file contains the User object.
// History:
// Wed 17-Apr-1996 11:13:54 -by- Viroon Touranachun [viroont]
//
// Copyright (c) Microsoft Corporation 1996-1997
//
//****************************************************************************
#include "ulsp.h"
#include "ulsuser.h"
#include "ulsapp.h"
#include "culs.h"
#include "attribs.h"
#include "callback.h"
//****************************************************************************
// Event Notifiers
//****************************************************************************
//
//****************************************************************************
// HRESULT
// OnNotifyGetApplicationResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT OnNotifyGetApplicationResult (IUnknown *pUnk, void *pv) { POBJRINFO pobjri = (POBJRINFO)pv;
((IULSUserNotify*)pUnk)->GetApplicationResult(pobjri->uReqID, (IULSApplication *)pobjri->pv, pobjri->hResult); return S_OK; }
//****************************************************************************
// HRESULT
// OnNotifyEnumApplicationsResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT OnNotifyEnumApplicationsResult (IUnknown *pUnk, void *pv) { CEnumNames *penum = NULL; PENUMRINFO peri = (PENUMRINFO)pv; HRESULT hr = peri->hResult;
if (SUCCEEDED(hr)) { // Create a Application enumerator
//
penum = new CEnumNames;
if (penum != NULL) { hr = penum->Init((LPTSTR)peri->pv, peri->cItems);
if (SUCCEEDED(hr)) { penum->AddRef(); } else { delete penum; penum = NULL; }; } else { hr = ULS_E_MEMORY; }; };
// Notify the sink object
//
((IULSUserNotify*)pUnk)->EnumApplicationsResult(peri->uReqID, penum != NULL ? (IEnumULSNames *)penum : NULL, hr);
if (penum != NULL) { penum->Release(); }; return hr; }
//****************************************************************************
// Class Implementation
//****************************************************************************
//
//****************************************************************************
// CUlsUser::CUlsUser (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CUlsUser::CUlsUser (void) { cRef = 0; szServer = NULL; szID = NULL; szFirstName = NULL; szLastName = NULL; szEMailName = NULL; szCityName = NULL; szCountryName= NULL; szComment = NULL; szIPAddr = NULL; m_dwFlags = 0; pConnPt = NULL;
return; }
//****************************************************************************
// CUlsUser::~CUlsUser (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CUlsUser::~CUlsUser (void) { if (szServer != NULL) FreeLPTSTR(szServer); if (szID != NULL) FreeLPTSTR(szID); if (szFirstName != NULL) FreeLPTSTR(szFirstName); if (szLastName != NULL) FreeLPTSTR(szLastName); if (szEMailName != NULL) FreeLPTSTR(szEMailName); if (szCityName != NULL) FreeLPTSTR(szCityName); if (szCountryName != NULL) FreeLPTSTR(szCountryName); if (szComment != NULL) FreeLPTSTR(szComment); if (szIPAddr != NULL) FreeLPTSTR(szIPAddr);
// Release the connection point
//
if (pConnPt != NULL) { pConnPt->ContainerReleased(); ((IConnectionPoint*)pConnPt)->Release(); };
return; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::Init (LPTSTR szServerName, PLDAP_USERINFO *pui)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::Init (LPTSTR szServerName, PLDAP_USERINFO pui) { HRESULT hr;
// Validate parameter
//
if ((pui->uSize != sizeof(*pui)) || (pui->uOffsetName == 0)) { return ULS_E_PARAMETER; };
// Remember the server name
//
hr = SafeSetLPTSTR(&szServer, szServerName);
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szID, (LPCTSTR)(((PBYTE)pui)+pui->uOffsetName));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szFirstName, (LPCTSTR)(((PBYTE)pui)+pui->uOffsetFirstName));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szLastName, (LPCTSTR)(((PBYTE)pui)+pui->uOffsetLastName));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szEMailName, (LPCTSTR)(((PBYTE)pui)+pui->uOffsetEMailName));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szCityName, (LPCTSTR)(((PBYTE)pui)+pui->uOffsetCityName));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szCountryName, (LPCTSTR)(((PBYTE)pui)+ pui->uOffsetCountryName));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szComment, (LPCTSTR)(((PBYTE)pui)+ pui->uOffsetComment));
if (SUCCEEDED(hr)) { hr = SafeSetLPTSTR(&szIPAddr, (LPCTSTR)(((PBYTE)pui)+ pui->uOffsetIPAddress)); m_dwFlags = pui->dwFlags; }; }; }; }; }; }; }; };
if (SUCCEEDED(hr)) { // Make the connection point
//
pConnPt = new CConnectionPoint (&IID_IULSUserNotify, (IConnectionPointContainer *)this); if (pConnPt != NULL) { ((IConnectionPoint*)pConnPt)->AddRef(); hr = NOERROR; } else { hr = ULS_E_MEMORY; }; }; return hr; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::QueryInterface (REFIID riid, void **ppv) { *ppv = NULL;
if (riid == IID_IULSUser || riid == IID_IUnknown) { *ppv = (IULSUser *) this; } else { if (riid == IID_IConnectionPointContainer) { *ppv = (IConnectionPointContainer *) this; }; };
if (*ppv != NULL) { ((LPUNKNOWN)*ppv)->AddRef(); return S_OK; } else { return ULS_E_NO_INTERFACE; }; }
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CUlsUser::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:14:17 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CUlsUser::AddRef (void) { cRef++; return cRef; }
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CUlsUser::Release (void)
//
// History:
// Wed 17-Apr-1996 11:14:26 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CUlsUser::Release (void) { cRef--;
if (cRef == 0) { delete this; return 0; } else { return cRef; }; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::NotifySink (void *pv, CONN_NOTIFYPROC pfn) { HRESULT hr = S_OK;
if (pConnPt != NULL) { hr = pConnPt->Notify(pv, pfn); }; return hr; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetID (BSTR *pbstrID)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetID (BSTR *pbstrID) { // Validate parameter
//
if (pbstrID == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrID, szID); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetFirstName (BSTR *pbstrName)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetFirstName (BSTR *pbstrName) { // Validate parameter
//
if (pbstrName == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrName, szFirstName); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetLastName (BSTR *pbstrName)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetLastName (BSTR *pbstrName) { // Validate parameter
//
if (pbstrName == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrName, szLastName); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetEMailName (BSTR *pbstrName)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetEMailName (BSTR *pbstrName) { // Validate parameter
//
if (pbstrName == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrName, szEMailName); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetCityName (BSTR *pbstrName)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetCityName (BSTR *pbstrName) { // Validate parameter
//
if (pbstrName == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrName, szCityName); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetCountryName (BSTR *pbstrName)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetCountryName (BSTR *pbstrName) { // Validate parameter
//
if (pbstrName == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrName, szCountryName); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetComment (BSTR *pbstrComment)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetComment (BSTR *pbstrComment) { // Validate parameter
//
if (pbstrComment == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrComment, szComment); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetFlags ( DWORD *pdwFlags )
//
// History:
// Tue 05-Nov-1996 10:30:00 -by- Chu, Lon-Chan [lonchanc]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetFlags ( DWORD *pdwFlags ) { // Validate parameter
//
if (pdwFlags == NULL) return ULS_E_POINTER;
*pdwFlags = m_dwFlags; return S_OK; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetIPAddress (BSTR *pbstrAddr)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetIPAddress (BSTR *pbstrAddr) { // Validate parameter
//
if (pbstrAddr == NULL) { return E_POINTER; };
return LPTSTR_to_BSTR(pbstrAddr, szIPAddr); }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetApplication (REFGUID rguid, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetApplication (BSTR bstrAppName, IULSAttributes *pAttributes, ULONG *puReqID) { LDAP_ASYNCINFO ldai; LPTSTR pszAppName; HRESULT hr;
// Validate parameter
//
if (bstrAppName == NULL || puReqID == NULL) return E_POINTER;
// Convert application name
//
hr = BSTR_to_LPTSTR (&pszAppName, bstrAppName); if (hr != S_OK) return hr;
// Get arbitrary attribute name list if any
//
ULONG cAttrNames = 0; ULONG cbNames = 0; TCHAR *pszAttrNameList = NULL; if (pAttributes != NULL) { hr = ((CAttributes *) pAttributes)->GetAttributeList (&pszAttrNameList, &cAttrNames, &cbNames); if (hr != S_OK) return hr; }
hr = ::UlsLdap_ResolveApp (szServer, szID, pszAppName, pszAttrNameList, cAttrNames, &ldai); if (hr != S_OK) goto MyExit;
// If updating server was successfully requested, wait for the response
//
REQUESTINFO ri; ZeroMemory (&ri, sizeof (ri)); ri.uReqType = WM_ULS_RESOLVE_APP; ri.uMsgID = ldai.uMsgID; ri.pv = (PVOID) this; ri.lParam = NULL;
// 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:
if (pszAttrNameList != NULL) FreeLPTSTR (pszAttrNameList);
if (pszAppName != NULL) FreeLPTSTR(pszAppName);
return hr; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::GetApplicationResult (ULONG uReqID, PLDAP_APPINFO_RES pair)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::GetApplicationResult (ULONG uReqID, PLDAP_APPINFO_RES pair) { CUlsApp *pa; OBJRINFO objri;
// Default to the server's result
//
objri.hResult = pair->hResult;
if (SUCCEEDED(objri.hResult)) { // The server returns APPINFO, create a Application object
//
pa = new CUlsApp;
if (pa != NULL) { objri.hResult = pa->Init(szServer, szID, &pair->lai); if (SUCCEEDED(objri.hResult)) { pa->AddRef(); } else { delete pa; pa = NULL; }; } else { objri.hResult = ULS_E_MEMORY; }; } else { pa = NULL; };
// Package the notification info
//
objri.uReqID = uReqID; objri.pv = (void *)(pa == NULL ? NULL : (IULSApplication *)pa); NotifySink((void *)&objri, OnNotifyGetApplicationResult);
if (pa != NULL) { pa->Release(); }; return NOERROR; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::EnumApplications (ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::EnumApplications (ULONG *puReqID) { LDAP_ASYNCINFO ldai; HRESULT hr;
// Validate parameter
//
if (puReqID == NULL) { return E_POINTER; };
hr = ::UlsLdap_EnumApps(szServer, szID, &ldai);
if (SUCCEEDED(hr)) { REQUESTINFO ri;
// If updating server was successfully requested, wait for the response
//
ri.uReqType = WM_ULS_ENUM_APPS; ri.uMsgID = ldai.uMsgID; ri.pv = (PVOID)this; ri.lParam = (LPARAM)NULL;
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
// CUlsUser::EnumApplicationsResult (ULONG uReqID, PLDAP_ENUM ple)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::EnumApplicationsResult (ULONG uReqID, PLDAP_ENUM ple) { ENUMRINFO eri;
// Package the notification info
//
eri.uReqID = uReqID; eri.hResult = ple->hResult; eri.cItems = ple->cItems; eri.pv = (void *)(((PBYTE)ple)+ple->uOffsetItems); NotifySink((void *)&eri, OnNotifyEnumApplicationsResult); return NOERROR; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::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 ULS_E_MEMORY;
// Initialize the enumerator
//
hr = pecp->Init((IConnectionPoint *)pConnPt); if (FAILED(hr)) { delete pecp; return hr; };
// Give it back to the caller
//
pecp->AddRef(); *ppEnum = pecp; return S_OK; }
//****************************************************************************
// STDMETHODIMP
// CUlsUser::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
//
// History:
// Wed 17-Apr-1996 11:15:09 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CUlsUser::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp) { IID siid; HRESULT hr;
// Validate parameters
//
if (ppcp == NULL) { return E_POINTER; }; // Assume failure
//
*ppcp = NULL;
if (pConnPt != NULL) { hr = pConnPt->GetConnectionInterface(&siid);
if (SUCCEEDED(hr)) { if (riid == siid) { *ppcp = (IConnectionPoint *)pConnPt; (*ppcp)->AddRef(); hr = S_OK; } else { hr = ULS_E_NO_INTERFACE; }; }; } else { hr = ULS_E_NO_INTERFACE; };
return hr; }
//****************************************************************************
// CEnumUsers::CEnumUsers (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumUsers::CEnumUsers (void) { cRef = 0; ppu = NULL; cUsers = 0; 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 (ppu != NULL) { for (i = 0; i < cUsers; i++) { ppu[i]->Release(); }; LocalFree(ppu); }; return; }
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Init (CUlsUser **ppuList, ULONG cUsers)
//
// History:
// Wed 17-Apr-1996 11:15:25 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumUsers::Init (CUlsUser **ppuList, ULONG cUsers) { HRESULT hr = NOERROR;
// If no list, do nothing
//
if (cUsers != 0) { ASSERT(ppuList != NULL);
// Allocate the snapshot buffer
//
ppu = (CUlsUser **)LocalAlloc(LPTR, cUsers*sizeof(CUlsUser *));
if (ppu != NULL) { ULONG i;
// Snapshot the object list
//
for (i =0; i < cUsers; i++) { ppu[i] = ppuList[i]; ppu[i]->AddRef(); }; this->cUsers = cUsers; } else { hr = ULS_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_IEnumULSUsers || riid == IID_IUnknown) { *ppv = (IEnumULSUsers *) this; AddRef(); return S_OK; } else { *ppv = NULL; return ULS_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) { cRef++; return cRef; }
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumUsers::Release (void)
//
// History:
// Wed 17-Apr-1996 11:15:43 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CEnumUsers::Release (void) { cRef--;
if (cRef == 0) { delete this; return 0; } else { return cRef; }; }
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Next (ULONG cUsers, IULSUser **rgpu, ULONG *pcFetched)
//
// History:
// Wed 17-Apr-1996 11:15:49 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumUsers::Next (ULONG cUsers, IULSUser **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 ULS_E_PARAMETER;
// Check the enumeration index
//
cCopied = 0;
// Can copy if we still have more attribute names
//
while ((cCopied < cUsers) && (iNext < this->cUsers)) { ppu[iNext]->AddRef(); rgpu[cCopied++] = ppu[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 ULS_E_PARAMETER;
// Check the enumeration index limit
//
iNewIndex = iNext+cUsers; if (iNewIndex <= this->cUsers) { iNext = iNewIndex; return S_OK; } else { iNext = this->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) { iNext = 0; return S_OK; }
//****************************************************************************
// STDMETHODIMP
// CEnumUsers::Clone(IEnumULSUsers **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:16:11 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumUsers::Clone(IEnumULSUsers **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 ULS_E_MEMORY;
// Clone the information
//
hr = peu->Init(ppu, cUsers);
if (SUCCEEDED(hr)) { peu->iNext = iNext;
// Return the cloned enumerator
//
peu->AddRef(); *ppEnum = peu; } else { delete peu; }; return hr; }
|