|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: I N T E R F A C E M A N A G E R . C P P
//
// Contents: Manages building the list of IP addresses
//
// Notes:
//
// Author: mbend 3 Jan 2001
//
//----------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
#include "InterfaceManager.h"
#include "winsock2.h"
CInterfaceManager::CInterfaceManager() { }
CInterfaceManager::~CInterfaceManager() { }
HRESULT CInterfaceManager::HrInitializeWithAllInterfaces() { HRESULT hr = S_OK;
// Preallocate mapping table
m_bAllInterfaces = TRUE; m_interfaceMappingList.Clear(); hr = HrProcessIpAddresses();
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrInitializeWithAllInterfaces"); return hr; }
HRESULT CInterfaceManager::HrInitializeWithIncludedInterfaces(const InterfaceList & interfaceList) { HRESULT hr = S_OK;
m_bAllInterfaces = FALSE; long nCount = interfaceList.GetCount(); // Preallocate mapping table
m_interfaceMappingList.Clear(); hr = m_interfaceMappingList.HrSetCount(nCount); if(SUCCEEDED(hr)) { for(long n = 0; n < nCount; ++n) { m_interfaceMappingList[n].m_guidInterface = interfaceList[n]; m_interfaceMappingList[n].m_dwIpAddress = 0; } hr = HrProcessIpAddresses(); }
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrInitializeWithIncludedInterfaces"); return hr; }
HRESULT CInterfaceManager::HrGetValidIpAddresses(IpAddressList & ipAddressList) { HRESULT hr = S_OK;
long nCount = m_interfaceMappingList.GetCount(); ipAddressList.Clear(); hr = ipAddressList.HrSetCount(nCount + 1); if(SUCCEEDED(hr)) { for(long n = 0; n < nCount; ++n) { ipAddressList[n] = m_interfaceMappingList[n].m_dwIpAddress; } // Add loopback address
ipAddressList[n] = inet_addr("127.0.0.1"); }
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrGetValidIpAddresses"); return hr; }
HRESULT CInterfaceManager::HrGetValidIndices(IndexList & indexList) { HRESULT hr = S_OK;
long nCount = m_interfaceMappingList.GetCount(); indexList.Clear(); hr = indexList.HrSetCount(nCount); if(SUCCEEDED(hr)) { for(long n = 0; n < nCount; ++n) { indexList[n] = m_interfaceMappingList[n].m_dwIndex; } } // Loopback case is handled separately but in HrGetValidIpAddresses() we have Loopback entry.
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrGetValidIndices"); return hr; }
HRESULT CInterfaceManager::HrAddInterfaceMappingIfPresent(DWORD dwIpAddress, DWORD dwIndex, const GUID & guidInterface) { HRESULT hr = S_OK;
if(m_bAllInterfaces) { //InterfaceMapping interfaceMapping = {guidInterface, dwIpAddress};
InterfaceMapping interfaceMapping; interfaceMapping.m_dwIpAddress = dwIpAddress; interfaceMapping.m_dwIndex = dwIndex; interfaceMapping.m_guidInterface = guidInterface; hr = m_interfaceMappingList.HrPushBack(interfaceMapping); } else { long nCount = m_interfaceMappingList.GetCount(); for(long n = 0; n < nCount; ++n) { if(m_interfaceMappingList[n].m_guidInterface == guidInterface) { m_interfaceMappingList[n].m_dwIndex = dwIndex; m_interfaceMappingList[n].m_dwIpAddress = dwIpAddress; break; } } }
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrAddInterfaceMappingIfPresent"); return hr; }
HRESULT CInterfaceManager::HrProcessIpAddresses() { HRESULT hr = S_OK;
CInterfaceTable interfaceTable; hr = interfaceTable.HrInitialize(); if(SUCCEEDED(hr)) { InterfaceMappingList interfaceMappingList; hr = interfaceTable.HrGetMappingList(interfaceMappingList); if(SUCCEEDED(hr)) { long nCount = interfaceMappingList.GetCount(); for(long n = 0; n < nCount && SUCCEEDED(hr); ++n) { hr = HrAddInterfaceMappingIfPresent( interfaceMappingList[n].m_dwIpAddress, interfaceMappingList[n].m_dwIndex, interfaceMappingList[n].m_guidInterface); } } }
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrProcessIpAddresses"); return hr; }
HRESULT CInterfaceManager::HrGetMappingList(InterfaceMappingList & interfaceMappingList) { HRESULT hr = S_OK;
interfaceMappingList.Swap(m_interfaceMappingList);
TraceHr(ttidSsdpNetwork, FAL, hr, FALSE, "CInterfaceManager::HrGetMappingList"); return hr; }
|