154 lines
3.9 KiB
C++
154 lines
3.9 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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;
|
|
}
|
|
|