//+--------------------------------------------------------------------------- // // 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 #include #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; }