|
|
//****************************************************************************
//
// Module: ULS.DLL
// File: localapp.cpp
// Content: This file contains the LocalApplication object.
// History:
// Wed 17-Apr-1996 11:13:54 -by- Viroon Touranachun [viroont]
//
// Copyright (c) Microsoft Corporation 1996-1997
//
//****************************************************************************
#include "ulsp.h"
#include "localapp.h"
#include "localprt.h"
#include "attribs.h"
#include "callback.h"
#include "culs.h"
//****************************************************************************
// Event Notifiers
//****************************************************************************
//
//****************************************************************************
// HRESULT
// OnNotifyLocalAppAttributesChangeResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT OnNotifyLocalAppAttributesChangeResult (IUnknown *pUnk, void *pv) { PSRINFO psri = (PSRINFO)pv;
((IULSLocalAppNotify*)pUnk)->AttributesChangeResult(psri->uReqID, psri->hResult); return S_OK; }
//****************************************************************************
// HRESULT
// OnNotifyLocalAppProtocolChangeResult (IUnknown *pUnk, void *pv)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
HRESULT OnNotifyLocalAppProtocolChangeResult (IUnknown *pUnk, void *pv) { PSRINFO psri = (PSRINFO)pv;
((IULSLocalAppNotify*)pUnk)->ProtocolChangeResult(psri->uReqID, psri->hResult); return S_OK; }
//****************************************************************************
// Class Implementation
//****************************************************************************
//
//****************************************************************************
// CLocalApp::CLocalApp (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CLocalApp::CLocalApp (void) { cRef = 0; szName = NULL; guid = GUID_NULL; szMimeType = NULL; pAttrs = NULL; pConnPt = NULL; return; }
//****************************************************************************
// CLocalApp::~CLocalApp (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CLocalApp::~CLocalApp (void) { CLocalProt *plp; HANDLE hEnum;
// Release the connection point
//
if (pConnPt != NULL) { pConnPt->ContainerReleased(); ((IConnectionPoint*)pConnPt)->Release(); };
// Release the protocol objects
//
ProtList.Enumerate(&hEnum); while(ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR) { plp->Release(); }; ProtList.Flush();
// Release the attributes object
//
if (pAttrs != NULL) { pAttrs->Release(); };
// Release the buffer resources
//
if (szName != NULL) { FreeLPTSTR(szName); };
if (szMimeType != NULL) { FreeLPTSTR(szMimeType); };
return; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::Init (BSTR bstrName, REFGUID rguid, BSTR bstrMimeType)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::Init (BSTR bstrName, REFGUID rguid, BSTR bstrMimeType) { HRESULT hr;
// Cache the application information
//
guid = rguid;
hr = BSTR_to_LPTSTR(&szName, bstrName); if (SUCCEEDED(hr)) { hr = BSTR_to_LPTSTR(&szMimeType, bstrMimeType); if (SUCCEEDED(hr)) { // Initialize the attributes list
//
pAttrs = new CAttributes (ULS_ATTRACCESS_NAME_VALUE);
if (pAttrs != NULL) { // Make the connection point
//
pConnPt = new CConnectionPoint (&IID_IULSLocalAppNotify, (IConnectionPointContainer *)this); if (pConnPt != NULL) { ((IConnectionPoint*)pConnPt)->AddRef(); hr = NOERROR; } else { hr = ULS_E_MEMORY; }; } else { hr = ULS_E_MEMORY; }; }; };
return hr; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:14:08 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::QueryInterface (REFIID riid, void **ppv) { *ppv = NULL;
if (riid == IID_IULSLocalApplication || riid == IID_IUnknown) { *ppv = (IULS *) 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)
// CLocalApp::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:14:17 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CLocalApp::AddRef (void) { cRef++; return cRef; }
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CLocalApp::Release (void)
//
// History:
// Wed 17-Apr-1996 11:14:26 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CLocalApp::Release (void) { cRef--;
if (cRef == 0) { delete this; return 0; } else { return cRef; }; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::NotifySink (void *pv, CONN_NOTIFYPROC pfn)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::NotifySink (void *pv, CONN_NOTIFYPROC pfn) { HRESULT hr = S_OK;
if (pConnPt != NULL) { hr = pConnPt->Notify(pv, pfn); }; return hr; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::AttributesChangeResult (CAttributes *pAttributes,
// ULONG uReqID, HRESULT hResult,
// APP_CHANGE_ATTRS uCmd)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::AttributesChangeResult (CAttributes *pAttributes, ULONG uReqID, HRESULT hResult, APP_CHANGE_ATTRS uCmd) { SRINFO sri;
// If the server accepts the changes, modify the local information
//
if (SUCCEEDED(hResult)) { // Update based on the command.
//
switch(uCmd) { case ULS_APP_SET_ATTRIBUTES: hResult = pAttrs->SetAttributes(pAttributes); break;
case ULS_APP_REMOVE_ATTRIBUTES: hResult = pAttrs->RemoveAttributes(pAttributes); break;
default: ASSERT(0); break; }; };
// Notify the sink object
//
sri.uReqID = uReqID; sri.hResult = hResult; hResult = NotifySink((void *)&sri, OnNotifyLocalAppAttributesChangeResult);
#ifdef DEBUG
DPRINTF (TEXT("CLocalApp--current attributes********************\r\n")); pAttrs->DebugOut(); DPRINTF (TEXT("\r\n*************************************************")); #endif // DEBUG;
return hResult; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::ProtocolChangeResult (CLocalProt *pProtocol,
// ULONG uReqID, HRESULT hResult,
// APP_CHANGE_PROT uCmd)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::ProtocolChangeResult (CLocalProt *pProtocol, ULONG uReqID, HRESULT hResult, APP_CHANGE_PROT uCmd) { SRINFO sri;
// If the server accepts the changes, modify the local information
//
if (SUCCEEDED(hResult)) { // Update based on the command.
//
switch(uCmd) { case ULS_APP_ADD_PROT: hResult = ProtList.Insert((PVOID)pProtocol); if (SUCCEEDED(hResult)) { pProtocol->AddRef(); }; break;
case ULS_APP_REMOVE_PROT: hResult = ProtList.Remove((PVOID)pProtocol); if (SUCCEEDED(hResult)) { pProtocol->Release(); }; break;
default: ASSERT(0); break; }; };
// Notify the sink object
//
sri.uReqID = uReqID; sri.hResult = hResult; hResult = NotifySink((void *)&sri, OnNotifyLocalAppProtocolChangeResult);
#ifdef DEBUG
DPRINTF (TEXT("CLocalApp--current Protocols********************\r\n")); DebugProtocolDump(); DPRINTF (TEXT("\r\n*************************************************")); #endif // DEBUG;
return hResult; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::CreateProtocol (BSTR bstrProtocolID, ULONG uPortNumber,
// BSTR bstrMimeType,
// IULSLocalAppProtocol **ppProtocol)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::CreateProtocol (BSTR bstrProtocolID, ULONG uPortNumber, BSTR bstrMimeType, IULSLocalAppProtocol **ppProtocol) { CLocalProt *plp; HRESULT hr;
// Validate parameter
//
if (ppProtocol == NULL) { return ULS_E_POINTER; };
// Assume failure
//
*ppProtocol = NULL;
// Create a new object
//
plp = new CLocalProt;
if (plp != NULL) { hr = plp->Init(bstrProtocolID, uPortNumber, bstrMimeType);
if (SUCCEEDED(hr)) { plp->AddRef(); *ppProtocol = plp; }; } else { hr = ULS_E_MEMORY; };
return hr; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::ChangeProtocol (IULSLocalAppProtocol *pProtocol,
// ULONG *puReqID, APP_CHANGE_PROT uCmd)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::ChangeProtocol (IULSLocalAppProtocol *pProtocol, ULONG *puReqID, APP_CHANGE_PROT uCmd) { CLocalProt *plp; PVOID pv; HRESULT hr; HANDLE hLdapApp; LDAP_ASYNCINFO ldai; HANDLE hEnum;
// Validate parameters
//
if ((pProtocol == NULL) || (puReqID == NULL)) { return ULS_E_POINTER; };
hr = pProtocol->QueryInterface(IID_IULSLocalAppProtocol, &pv);
if (FAILED(hr)) { return ULS_E_PARAMETER; }; pProtocol->Release();
// Check whether the protocol exists
//
ProtList.Enumerate(&hEnum); while(ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR) { if (plp->IsSameAs((CLocalProt *)pProtocol) == NOERROR) { break; }; };
if (plp != NULL) { // The protocol exists, fail if this add request
//
if (uCmd == ULS_APP_ADD_PROT) { return ULS_E_PARAMETER; }; } else { // The protocol does not exist, fail if this remove request
//
if (uCmd == ULS_APP_REMOVE_PROT) { return ULS_E_PARAMETER; }; };
// Update the server information first
//
switch (uCmd) { case ULS_APP_ADD_PROT: hr = g_pCUls->RegisterLocalProtocol((CLocalProt*)pProtocol, &ldai); break;
case ULS_APP_REMOVE_PROT: hr = g_pCUls->UnregisterLocalProtocol((CLocalProt*)pProtocol, &ldai); break;
default: ASSERT(0); break; }; switch (hr) { case NOERROR: //
// Server starts updating the protocol successfullly
// We will wait for the server response.
//
break;
case S_FALSE: //
// We have not registered, will do local response
//
hr = NOERROR; ldai.uMsgID = 0; break;
default: // ULS is locked. Return failure.
//
hr = ULS_E_ABORT; break; }
if (SUCCEEDED(hr)) { REQUESTINFO ri; ULONG uMsg;
switch(uCmd) { case ULS_APP_ADD_PROT: uMsg = (ldai.uMsgID == 0 ? WM_ULS_LOCAL_REGISTER_PROTOCOL: WM_ULS_REGISTER_PROTOCOL); break;
case ULS_APP_REMOVE_PROT: uMsg = (ldai.uMsgID == 0 ? WM_ULS_LOCAL_UNREGISTER_PROTOCOL : WM_ULS_UNREGISTER_PROTOCOL); break;
default: ASSERT(0); break; }; // If updating server was successfully requested, wait for the response
//
ri.uReqType = uMsg; ri.uMsgID = ldai.uMsgID; ri.pv = (PVOID)this; ri.lParam = (LPARAM)((CLocalProt*)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;
// If not registered with server, start async response ourselves
//
if (ldai.uMsgID == 0) { g_pCUls->LocalAsyncRespond(uMsg, ri.uReqID, NOERROR); }; }; };
return hr; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::AddProtocol (IULSLocalAppProtocol *pProtocol,
// ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::AddProtocol (IULSLocalAppProtocol *pProtocol, ULONG *puReqID) { return ChangeProtocol(pProtocol, puReqID, ULS_APP_ADD_PROT); }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::RemoveProtocol (IULSLocalAppProtocol *pProtocol,
// ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::RemoveProtocol (IULSLocalAppProtocol *pProtocol, ULONG *puReqID) { return ChangeProtocol(pProtocol, puReqID, ULS_APP_REMOVE_PROT); }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::EnumProtocols (IEnumULSLocalAppProtocols **ppEnumProtocol)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::EnumProtocols (IEnumULSLocalAppProtocols **ppEnumProtocol) { CEnumLocalAppProtocols *pep; HRESULT hr;
// Validate parameters
//
if (ppEnumProtocol == NULL) { return ULS_E_POINTER; };
// Assume failure
//
*ppEnumProtocol = NULL;
// Create a peer enumerator
//
pep = new CEnumLocalAppProtocols;
if (pep != NULL) { hr = pep->Init(&ProtList);
if (SUCCEEDED(hr)) { // Get the enumerator interface
//
pep->AddRef(); *ppEnumProtocol = pep; } else { delete pep; }; } else { hr = ULS_E_MEMORY; }; return hr; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::ChangeAttributes (IULSAttributes *pAttributes, ULONG *puReqID,
// APP_CHANGE_ATTRS uCmd)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::ChangeAttributes (IULSAttributes *pAttributes, ULONG *puReqID, APP_CHANGE_ATTRS uCmd) { PVOID pv; HRESULT hr; HANDLE hLdapApp; LDAP_ASYNCINFO ldai;
// Validate parameters
//
if ((pAttributes == NULL) || (puReqID == NULL)) { return ULS_E_POINTER; };
hr = pAttributes->QueryInterface(IID_IULSAttributes, &pv);
if (FAILED(hr)) { return ULS_E_PARAMETER; };
// If no attributes, fails the call
//
if (((CAttributes*)pAttributes)->GetCount() == 0) { return ULS_E_PARAMETER; };
// Check if already registered
//
hr = g_pCUls->GetAppHandle(&hLdapApp);
switch (hr) { case NOERROR: { LPTSTR pAttrList; ULONG cAttrs, cb;
// Yes, get the attributes list
//
switch (uCmd) { case ULS_APP_SET_ATTRIBUTES: hr = ((CAttributes*)pAttributes)->GetAttributePairs(&pAttrList, &cAttrs, &cb); if (SUCCEEDED(hr)) { hr = ::UlsLdap_SetAppAttrs(hLdapApp, cAttrs, pAttrList, &ldai); FreeLPTSTR(pAttrList); }; break;
case ULS_APP_REMOVE_ATTRIBUTES: hr = ((CAttributes*)pAttributes)->GetAttributeList(&pAttrList, &cAttrs, &cb);
if (SUCCEEDED(hr)) { hr = ::UlsLdap_RemoveAppAttrs(hLdapApp, cAttrs, pAttrList, &ldai); FreeLPTSTR(pAttrList); }; break;
default: ASSERT(0); break; }; break; } case S_FALSE: //
// Not registered, will do local response
//
hr = NOERROR; ldai.uMsgID = 0; break;
default: // ULS is locked. Return failure.
//
hr = ULS_E_ABORT; break; };
if (SUCCEEDED(hr)) { REQUESTINFO ri; ULONG uMsg;
switch(uCmd) { case ULS_APP_SET_ATTRIBUTES: uMsg = (ldai.uMsgID == 0 ? WM_ULS_LOCAL_SET_APP_ATTRS : WM_ULS_SET_APP_ATTRS); break;
case ULS_APP_REMOVE_ATTRIBUTES: uMsg = (ldai.uMsgID == 0 ? WM_ULS_LOCAL_REMOVE_APP_ATTRS : WM_ULS_REMOVE_APP_ATTRS); break;
default: ASSERT(0); break; };
// If updating server was successfully requested, wait for the response
//
ri.uReqType = uMsg; ri.uMsgID = ldai.uMsgID; ri.pv = (PVOID)this; ri.lParam = (LPARAM)((CAttributes *)pAttributes);
hr = g_pReqMgr->NewRequest(&ri);
if (SUCCEEDED(hr)) { // Make sure the objects do not disappear before we get the response
//
this->AddRef(); pAttributes->AddRef();
// Return the request ID
//
*puReqID = ri.uReqID;
// If not registered with server, start async response ourselves
//
if (ldai.uMsgID == 0) { g_pCUls->LocalAsyncRespond(uMsg, ri.uReqID, NOERROR); }; }; };
// Matching the QueryInterface
//
pAttributes->Release(); return hr; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::SetAttributes (IULSAttributes *pAttributes, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::SetAttributes (IULSAttributes *pAttributes, ULONG *puReqID) { return ChangeAttributes(pAttributes, puReqID, ULS_APP_SET_ATTRIBUTES); }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::RemoveAttributes (IULSAttributes *pAttributes, ULONG *puReqID)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::RemoveAttributes (IULSAttributes *pAttributes, ULONG *puReqID) { return ChangeAttributes(pAttributes, puReqID, ULS_APP_REMOVE_ATTRIBUTES); }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::GetAppInfo (PLDAP_APPINFO *ppAppInfo)
//
// History:
// Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::GetAppInfo (PLDAP_APPINFO *ppAppInfo) { PLDAP_APPINFO pai; ULONG cName, cMime; LPTSTR szAttrs; ULONG cAttrs, cbAttrs; HRESULT hr;
// Assume failure
//
*ppAppInfo = NULL;
// Calculate the buffer size
//
cName = lstrlen(szName)+1; cMime = lstrlen(szMimeType)+1;
// Get the attribute pairs
//
hr = pAttrs->GetAttributePairs(&szAttrs, &cAttrs, &cbAttrs); if (FAILED(hr)) { return hr; };
// Allocate the buffer
//
pai = (PLDAP_APPINFO)LocalAlloc(LPTR, sizeof(LDAP_APPINFO) + ((cName + cMime)* sizeof(TCHAR)) + cbAttrs); if (pai == NULL) { hr = ULS_E_MEMORY; } else { // Fill the structure content
//
pai->uSize = sizeof(*pai); pai->guid = guid; pai->uOffsetName = sizeof(*pai); pai->uOffsetMimeType = pai->uOffsetName + (cName*sizeof(TCHAR)); pai->cAttributes = cAttrs; pai->uOffsetAttributes = (cAttrs != 0 ? pai->uOffsetMimeType + (cMime*sizeof(TCHAR)) : 0);
// Copy the user information
//
lstrcpy((LPTSTR)(((PBYTE)pai)+pai->uOffsetName), szName); lstrcpy((LPTSTR)(((PBYTE)pai)+pai->uOffsetMimeType), szMimeType); if (cAttrs) { CopyMemory(((PBYTE)pai)+pai->uOffsetAttributes, szAttrs, cbAttrs); };
// Return the structure
//
*ppAppInfo = pai; };
if (szAttrs != NULL) { FreeLPTSTR(szAttrs); }; return NOERROR; }
//****************************************************************************
// STDMETHODIMP
// CLocalApp::EnumConnectionPoints(IEnumConnectionPoints **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:15:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::EnumConnectionPoints(IEnumConnectionPoints **ppEnum) { CEnumConnectionPoints *pecp; HRESULT hr;
// Validate parameters
//
if (ppEnum == NULL) { return ULS_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
// CLocalApp::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp)
//
// History:
// Wed 17-Apr-1996 11:15:09 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CLocalApp::FindConnectionPoint(REFIID riid, IConnectionPoint **ppcp) { IID siid; HRESULT hr;
// Validate parameters
//
if (ppcp == NULL) { return ULS_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; }
#ifdef DEBUG
//****************************************************************************
// void
// CLocalApp::DebugProtocolDump (void)
//
// History:
// Wed 17-Apr-1996 11:14:03 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
void CLocalApp::DebugProtocolDump (void) { CLocalProt *plp; BSTR bstrID; LPTSTR pszID; ULONG cCount; HANDLE hEnum;
// Each protocol
//
cCount = 1; ProtList.Enumerate(&hEnum); while(ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR) { if (SUCCEEDED(plp->GetID (&bstrID))) { BSTR_to_LPTSTR(&pszID, bstrID); DPRINTF2(TEXT("%d> %s"), cCount++, pszID); FreeLPTSTR(pszID); SysFreeString(bstrID); }; }; return; } #endif // DEBUG
//****************************************************************************
// CEnumLocalAppProtocols::CEnumLocalAppProtocols (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumLocalAppProtocols::CEnumLocalAppProtocols (void) { cRef = 0; hEnum = NULL; return; }
//****************************************************************************
// CEnumLocalAppProtocols::~CEnumLocalAppProtocols (void)
//
// History:
// Wed 17-Apr-1996 11:15:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CEnumLocalAppProtocols::~CEnumLocalAppProtocols (void) { CLocalProt *plp;
ProtList.Enumerate(&hEnum); while(ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR) { plp->Release(); }; ProtList.Flush(); return; }
//****************************************************************************
// STDMETHODIMP
// CEnumLocalAppProtocols::Init (CList *pProtList)
//
// History:
// Wed 17-Apr-1996 11:15:25 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumLocalAppProtocols::Init (CList *pProtList) { CLocalProt *plp; HRESULT hr;
// Duplicate the protocol list
//
hr = ProtList.Clone (pProtList, NULL);
if (SUCCEEDED(hr)) { // Add reference to each protocol object
//
ProtList.Enumerate(&hEnum); while(ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR) { plp->AddRef(); };
// Reset the enumerator
//
ProtList.Enumerate(&hEnum); }; return hr; }
//****************************************************************************
// STDMETHODIMP
// CEnumLocalAppProtocols::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Wed 17-Apr-1996 11:15:31 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumLocalAppProtocols::QueryInterface (REFIID riid, void **ppv) { if (riid == IID_IEnumULSLocalAppProtocols || riid == IID_IUnknown) { *ppv = (IEnumULSLocalAppProtocols *) this; AddRef(); return S_OK; } else { *ppv = NULL; return ULS_E_NO_INTERFACE; }; }
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumLocalAppProtocols::AddRef (void)
//
// History:
// Wed 17-Apr-1996 11:15:37 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CEnumLocalAppProtocols::AddRef (void) { cRef++; return cRef; }
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CEnumLocalAppProtocols::Release (void)
//
// History:
// Wed 17-Apr-1996 11:15:43 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG) CEnumLocalAppProtocols::Release (void) { cRef--;
if (cRef == 0) { delete this; return 0; } else { return cRef; }; }
//****************************************************************************
// STDMETHODIMP
// CEnumLocalAppProtocols::Next (ULONG cProtocols,
// IULSLocalAppProtocol **rgpProt,
// ULONG *pcFetched)
//
// History:
// Wed 17-Apr-1996 11:15:49 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumLocalAppProtocols::Next (ULONG cProtocols, IULSLocalAppProtocol **rgpProt, ULONG *pcFetched) { CLocalProt *plp; ULONG cCopied; HRESULT hr;
// Validate the pointer
//
if (rgpProt == NULL) return ULS_E_POINTER;
// Validate the parameters
//
if ((cProtocols == 0) || ((cProtocols > 1) && (pcFetched == NULL))) return ULS_E_PARAMETER;
// Check the enumeration index
//
cCopied = 0;
// Can copy if we still have more protocols
//
while ((cCopied < cProtocols) && (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
// CEnumLocalAppProtocols::Skip (ULONG cProtocols)
//
// History:
// Wed 17-Apr-1996 11:15:56 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumLocalAppProtocols::Skip (ULONG cProtocols) { CLocalProt *plp; ULONG cSkipped;
// Validate the parameters
//
if (cProtocols == 0) return ULS_E_PARAMETER;
// Check the enumeration index limit
//
cSkipped = 0;
// Can skip only if we still have more attributes
//
while ((cSkipped < cProtocols) && (ProtList.Next(&hEnum, (PVOID *)&plp) == NOERROR)) { cSkipped++; };
return (cProtocols == cSkipped ? S_OK : S_FALSE); }
//****************************************************************************
// STDMETHODIMP
// CEnumLocalAppProtocols::Reset (void)
//
// History:
// Wed 17-Apr-1996 11:16:02 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumLocalAppProtocols::Reset (void) { ProtList.Enumerate(&hEnum); return S_OK; }
//****************************************************************************
// STDMETHODIMP
// CEnumLocalAppProtocols::Clone(IEnumULSLocalAppProtocols **ppEnum)
//
// History:
// Wed 17-Apr-1996 11:16:11 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP CEnumLocalAppProtocols::Clone(IEnumULSLocalAppProtocols **ppEnum) { CEnumLocalAppProtocols *pep; HRESULT hr;
// Validate parameters
//
if (ppEnum == NULL) { return ULS_E_POINTER; };
*ppEnum = NULL;
// Create an enumerator
//
pep = new CEnumLocalAppProtocols; if (pep == NULL) return ULS_E_MEMORY;
// Clone the information
//
pep->hEnum = hEnum; hr = pep->ProtList.Clone (&ProtList, &(pep->hEnum));
if (SUCCEEDED(hr)) { CLocalProt *plp; HANDLE hEnumTemp;
// Add reference to each protocol object
//
pep->ProtList.Enumerate(&hEnumTemp); while(pep->ProtList.Next(&hEnumTemp, (PVOID *)&plp) == NOERROR) { plp->AddRef(); };
// Return the cloned enumerator
//
pep->AddRef(); *ppEnum = pep; } else { delete pep; }; return hr; }
|