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.
194 lines
3.9 KiB
194 lines
3.9 KiB
//
|
|
// Microsoft
|
|
//
|
|
// CollectionAdapter.h
|
|
|
|
#pragma once
|
|
|
|
#include "ScopeCriticalSection.h"
|
|
#include "AdapterInfo.h"
|
|
#include "PrimaryControlChannel.h"
|
|
|
|
#include <list>
|
|
#include <algorithm>
|
|
|
|
//
|
|
// Adapters
|
|
//
|
|
typedef std::list<IAdapterInfo*> LISTOF_ADAPTERS;
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
class CCollectionAdapters
|
|
{
|
|
|
|
//
|
|
// Properties
|
|
//
|
|
public:
|
|
|
|
CComAutoCriticalSection m_AutoCS;
|
|
|
|
LISTOF_ADAPTERS m_ListOfAdapters;
|
|
|
|
|
|
//
|
|
// Methods
|
|
//
|
|
public:
|
|
|
|
//
|
|
// standard destructor
|
|
//
|
|
~CCollectionAdapters();
|
|
|
|
|
|
//
|
|
// Add a new Adapter (Thread safe)
|
|
//
|
|
HRESULT
|
|
Add(
|
|
IN IAdapterInfo* pAdapterToAdd
|
|
);
|
|
|
|
//
|
|
// This version of Add will actualy create the new IAdapterInfo before adding it to the collection
|
|
// return the newly created IAdapterInfo or NULL is faild
|
|
//
|
|
IAdapterInfo*
|
|
Add(
|
|
IN ULONG nCookie,
|
|
IN short nType
|
|
);
|
|
|
|
|
|
//
|
|
// Remove a adapter from the list (Thead safe)
|
|
// by removing a adapter it will also kill all associated ControlChannel
|
|
//
|
|
HRESULT
|
|
Remove(
|
|
IN IAdapterInfo* pAdapterToRemove
|
|
);
|
|
|
|
|
|
//
|
|
// This version od Remove will remove the IAdapterInfo base on the given index
|
|
//
|
|
HRESULT
|
|
Remove(
|
|
IN ULONG nCookie
|
|
);
|
|
|
|
//
|
|
// Remove all the adapter from the collection
|
|
//
|
|
HRESULT
|
|
RemoveAll();
|
|
|
|
|
|
//
|
|
// Return an IAdapterInfo the caller is responsable of releasing the interface
|
|
//
|
|
HRESULT
|
|
GetAdapterInfo(
|
|
IN ULONG nCookie,
|
|
OUT IAdapterInfo** ppAdapterInfo
|
|
);
|
|
|
|
//
|
|
// Bind the given addresses with the given index representing the AdapterInfo
|
|
//
|
|
HRESULT
|
|
SetAddresses(
|
|
IN ULONG nCookie,
|
|
IN ULONG nAdapterIndex,
|
|
IN ULONG nAddressCount,
|
|
IN DWORD anAddress[]
|
|
);
|
|
|
|
|
|
HRESULT
|
|
ApplyPrimaryChannel(
|
|
CPrimaryControlChannel* pChannelToActivate
|
|
);
|
|
|
|
HRESULT
|
|
AdapterUpdatePrimaryChannel(
|
|
ULONG nCookie,
|
|
CPrimaryControlChannel *pChannel
|
|
);
|
|
|
|
|
|
private:
|
|
|
|
//
|
|
// Will return the IAdapterInfo* of for the given Cookie or NULL if not found
|
|
//
|
|
IAdapterInfo*
|
|
FindUsingCookie(
|
|
ULONG nCookie
|
|
)
|
|
{
|
|
|
|
for ( LISTOF_ADAPTERS::iterator theIterator = m_ListOfAdapters.begin();
|
|
theIterator != m_ListOfAdapters.end();
|
|
theIterator++
|
|
)
|
|
{
|
|
CAdapterInfo* pAdapterInfo = (CAdapterInfo*)(*theIterator);
|
|
if ( pAdapterInfo->m_nCookie == nCookie )
|
|
return *theIterator;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//
|
|
// Will return the IAdapterInfo* of given the AdapterIndex or NULL if not found
|
|
//
|
|
IAdapterInfo*
|
|
FindUsingAdapterIndex(
|
|
ULONG nAdapterIndex
|
|
)
|
|
{
|
|
MYTRACE_ENTER("FindUsingAdapterIndex");
|
|
MYTRACE("Looking for adapter %d", nAdapterIndex);
|
|
|
|
for ( LISTOF_ADAPTERS::iterator theIterator = m_ListOfAdapters.begin();
|
|
theIterator != m_ListOfAdapters.end();
|
|
theIterator++
|
|
)
|
|
{
|
|
CAdapterInfo* pAdapterInfo = (CAdapterInfo*)(*theIterator);
|
|
MYTRACE("ADAPTER index %d", pAdapterInfo->m_nAdapterIndex);
|
|
if ( pAdapterInfo->m_nAdapterIndex == nAdapterIndex )
|
|
return *theIterator;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
|
|
//
|
|
// Return true if the AdapterInfo is part of the collection
|
|
//
|
|
inline bool
|
|
FindUsingInterface(
|
|
IAdapterInfo* pAdapterToFind
|
|
)
|
|
{
|
|
LISTOF_ADAPTERS::iterator theIterator = std::find(
|
|
m_ListOfAdapters.begin(),
|
|
m_ListOfAdapters.end(),
|
|
pAdapterToFind
|
|
);
|
|
|
|
return *theIterator ? true : false;
|
|
}
|
|
|
|
|
|
};
|
|
|