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.
285 lines
6.5 KiB
285 lines
6.5 KiB
/*++
|
|
|
|
Copyright (c) 2000, Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
CollectionAdapterNotifySinks.cpp
|
|
|
|
Abstract:
|
|
|
|
Implement a collection of the CPrimaryControlChannel.cpp & CSecondaryControlChannel
|
|
in a threa safe way.
|
|
|
|
Author:
|
|
|
|
JP Duplessis (jpdup) 08-Dec-2000
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "PreComp.h"
|
|
#include "CollectionAdapterNotifySinks.h"
|
|
#include "AlgController.h"
|
|
|
|
|
|
CCollectionAdapterNotifySinks::~CCollectionAdapterNotifySinks()
|
|
{
|
|
RemoveAll();
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Add an already created Adapter
|
|
//
|
|
HRESULT
|
|
CCollectionAdapterNotifySinks::Add(
|
|
IN IAdapterNotificationSink* pAdapterSinkToAdd, // AdapterSink to be added at the collection
|
|
OUT DWORD* pdwNewCookie // Will be populated with the new unique id can be used later to retrieve the AdapterSink
|
|
)
|
|
{
|
|
try
|
|
{
|
|
ENTER_AUTO_CS
|
|
|
|
MYTRACE_ENTER("CCollectionAdapterNotifySinks::Add")
|
|
|
|
if ( !pdwNewCookie )
|
|
{
|
|
MYTRACE_ERROR("Return Cookie address not supplied", 0);
|
|
return E_INVALIDARG;
|
|
}
|
|
|
|
|
|
CAdapterSinkBuket* pNewBuketToAdd = new CAdapterSinkBuket(pAdapterSinkToAdd);
|
|
|
|
if ( !pNewBuketToAdd )
|
|
return E_OUTOFMEMORY;
|
|
|
|
*pdwNewCookie = 1;
|
|
|
|
|
|
//
|
|
// Find a unique cookie
|
|
//
|
|
if ( m_ListOfAdapterSinks.empty() )
|
|
{
|
|
//
|
|
// List is empty so obviously the cookie '1' is unique
|
|
//
|
|
MYTRACE("First SINK Cookie is %d", *pdwNewCookie);
|
|
pNewBuketToAdd->m_dwCookie = *pdwNewCookie;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// Travers the collection and stop when the cookie is not found
|
|
// this schema could be optimize but the number of Sink is not expect to be large (1 per ALG modules)
|
|
//
|
|
MYTRACE("Current size %d", m_ListOfAdapterSinks.size() );
|
|
|
|
while ( pNewBuketToAdd->m_dwCookie==0 )
|
|
{
|
|
MYTRACE("Search for unique Cookie %d", *pdwNewCookie);
|
|
|
|
for ( LISTOF_ADAPTER_NOTIFICATION_SINK::iterator theIterator = m_ListOfAdapterSinks.begin();
|
|
theIterator != m_ListOfAdapterSinks.end();
|
|
theIterator++
|
|
)
|
|
{
|
|
|
|
CAdapterSinkBuket* pAdapterSinkBuket = (CAdapterSinkBuket*)(*theIterator);
|
|
|
|
if ( pAdapterSinkBuket->m_dwCookie == *pdwNewCookie )
|
|
break;
|
|
else
|
|
{
|
|
pNewBuketToAdd->m_dwCookie = *pdwNewCookie;
|
|
break; // ok we found a unique cookie
|
|
}
|
|
|
|
|
|
}
|
|
|
|
*pdwNewCookie = *pdwNewCookie + 1;
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Add Sync to Collection
|
|
//
|
|
m_ListOfAdapterSinks.push_back(pNewBuketToAdd);
|
|
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Remove a adapter from the list (Thead safe)
|
|
//
|
|
HRESULT
|
|
CCollectionAdapterNotifySinks::Remove(
|
|
IN DWORD dwCookieToRemove
|
|
)
|
|
{
|
|
try
|
|
{
|
|
ENTER_AUTO_CS
|
|
|
|
MYTRACE_ENTER("CCollectionAdapterNotifySinks::Remove")
|
|
|
|
HRESULT hr = S_OK;
|
|
|
|
for ( LISTOF_ADAPTER_NOTIFICATION_SINK::iterator theIterator = m_ListOfAdapterSinks.begin();
|
|
theIterator != m_ListOfAdapterSinks.end();
|
|
theIterator++
|
|
)
|
|
{
|
|
|
|
CAdapterSinkBuket* pAdapterSinkBuket = (CAdapterSinkBuket*)(*theIterator);
|
|
|
|
if ( pAdapterSinkBuket->m_dwCookie == dwCookieToRemove )
|
|
{
|
|
delete pAdapterSinkBuket;
|
|
m_ListOfAdapterSinks.erase(theIterator);
|
|
return S_OK;
|
|
}
|
|
}
|
|
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return E_INVALIDARG; // if we are here that mean the cookie was not found
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// When an adapter form the collection
|
|
//
|
|
HRESULT
|
|
CCollectionAdapterNotifySinks::RemoveAll()
|
|
{
|
|
try
|
|
{
|
|
|
|
ENTER_AUTO_CS
|
|
MYTRACE_ENTER("CCollectionAdapterNotifySinks::RemoveAll")
|
|
|
|
|
|
//
|
|
// By deleting all the ControlChannel they will also cancel all their associated Redirection
|
|
//
|
|
LISTOF_ADAPTER_NOTIFICATION_SINK::iterator theIterator;
|
|
|
|
MYTRACE("Collection has %d item", m_ListOfAdapterSinks.size());
|
|
|
|
while ( m_ListOfAdapterSinks.size() > 0 )
|
|
{
|
|
theIterator = m_ListOfAdapterSinks.begin();
|
|
|
|
delete (*theIterator);
|
|
m_ListOfAdapterSinks.erase(theIterator);
|
|
}
|
|
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HRESULT
|
|
CCollectionAdapterNotifySinks::Notify(
|
|
eNOTIFY eAction,
|
|
IAdapterInfo* pIAdapterInfo
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
For all AdapterSink inteface in the current collection do a notify with the given action ADDED,REMOVED,MODIFIED
|
|
|
|
Arguments:
|
|
|
|
eAction - ADDED, REMOVED, MODIFIED
|
|
|
|
pIAdapterInfo - Interface of the Adapter with the current action to be notify to alg modules
|
|
|
|
Return Value:
|
|
|
|
void - None
|
|
|
|
Environment:
|
|
|
|
|
|
--*/
|
|
{
|
|
|
|
try
|
|
{
|
|
ENTER_AUTO_CS
|
|
MYTRACE_ENTER("CCollectionAdapterNotifySinks::NotifySink")
|
|
MYTRACE("Collection size %d", m_ListOfAdapterSinks.size());
|
|
|
|
|
|
for ( LISTOF_ADAPTER_NOTIFICATION_SINK::iterator theIterator = m_ListOfAdapterSinks.begin();
|
|
theIterator != m_ListOfAdapterSinks.end();
|
|
theIterator++
|
|
)
|
|
{
|
|
|
|
CAdapterSinkBuket* pAdapterSinkBuket = (CAdapterSinkBuket*)(*theIterator);
|
|
|
|
MYTRACE("Will notify AdapterSink with cookie #%d", pAdapterSinkBuket->m_dwCookie);
|
|
|
|
switch ( eAction )
|
|
{
|
|
case eNOTIFY_ADDED:
|
|
pAdapterSinkBuket->m_pInterface->AdapterAdded(pIAdapterInfo);
|
|
break;
|
|
|
|
case eNOTIFY_REMOVED:
|
|
pAdapterSinkBuket->m_pInterface->AdapterRemoved(pIAdapterInfo);
|
|
break;
|
|
|
|
case eNOTIFY_MODIFIED:
|
|
pAdapterSinkBuket->m_pInterface->AdapterModified(pIAdapterInfo);
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
catch(...)
|
|
{
|
|
return E_FAIL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|