Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

153 lines
3.9 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: I N T E R F A C E H E L P E R . C P P
//
// Contents: Manages dealing with multiple interfaces and interface changes
//
// Notes:
//
// Author: mbend 6 Feb 2001
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "InterfaceHelper.h"
#include "ssdp.h"
#include <iphlpapi.h>
#include <winsock2.h>
#include "cache.h"
CInterfaceHelper CInterfaceHelper::s_instance;
CInterfaceHelper::CInterfaceHelper()
{
}
CInterfaceHelper::~CInterfaceHelper()
{
}
CInterfaceHelper & CInterfaceHelper::Instance()
{
return s_instance;
}
void CInterfaceHelper::OnInterfaceChange(const InterfaceMappingList & interfaceMappingList)
{
HRESULT hr = S_OK;
InterfaceList interfaceList;
{
CLock lock(m_critSec);
hr = HrGenerateDirtyGuidList(m_interfaceMappingList, interfaceMappingList, interfaceList);
if(SUCCEEDED(hr))
{
// Copy the interface mapping list
long nCount = interfaceMappingList.GetCount();
m_interfaceMappingList.Clear();
if (nCount)
{
hr = m_interfaceMappingList.HrSetCount(nCount);
if(SUCCEEDED(hr))
{
for(long n = 0; n < nCount; ++n)
{
m_interfaceMappingList[n] = interfaceMappingList[n];
}
}
}
}
}
// Do this outside of lock
if(SUCCEEDED(hr))
{
hr = CSsdpCacheEntryManager::Instance().HrClearDirtyInterfaceGuids(interfaceList.GetCount(), interfaceList.GetData());
}
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceHelper::OnInterfaceChange");
}
HRESULT CInterfaceHelper::HrInitialize()
{
CLock lock(m_critSec);
HRESULT hr = S_OK;
hr = CUPnPInterfaceList::Instance().HrRegisterInterfaceChange(this);
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceHelper::HrInitialize");
return hr;
}
HRESULT CInterfaceHelper::HrShutdown()
{
HRESULT hr = S_OK;
CLock lock(m_critSec);
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceHelper::HrShutdown");
return hr;
}
HRESULT CInterfaceHelper::HrResolveAddress(DWORD dwIpAddress, GUID & guidInterface)
{
CLock lock(m_critSec);
HRESULT hr = S_OK;
ZeroMemory(&guidInterface, sizeof(guidInterface));
long nCount = m_interfaceMappingList.GetCount();
for(long n = 0; n < nCount; ++n)
{
if(m_interfaceMappingList[n].m_dwIpAddress == dwIpAddress)
{
guidInterface = m_interfaceMappingList[n].m_guidInterface;
break;
}
}
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceHelper::HrResolveAddress");
return hr;
}
HRESULT CInterfaceHelper::HrGenerateDirtyGuidList(
const InterfaceMappingList & interfaceMappingListOld,
const InterfaceMappingList & interfaceMappingListNew,
InterfaceList & interfaceList)
{
CLock lock(m_critSec);
HRESULT hr = S_OK;
long nCountOld = interfaceMappingListOld.GetCount();
long nCountNew = interfaceMappingListNew.GetCount();
for(long n = 0; n < nCountOld && SUCCEEDED(hr); ++n)
{
BOOL bDirty = TRUE;
for(long m = 0; m < nCountNew; ++m)
{
if(interfaceMappingListOld[n].m_guidInterface == interfaceMappingListNew[m].m_guidInterface)
{
if(interfaceMappingListOld[n].m_dwIpAddress == interfaceMappingListNew[m].m_dwIpAddress)
{
bDirty = FALSE;
}
break;
}
}
if(bDirty)
{
hr = interfaceList.HrPushBack(interfaceMappingListOld[n].m_guidInterface);
}
}
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceHelper::HrGenerateDirtyGuidList");
return hr;
}