windows-nt/Source/XPSP1/NT/net/tapi/skywalker/mdhcp/scope.cpp

330 lines
9.6 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
scope.cpp
Abstract:
Implementation of CMDhcpScope.
Author:
*/
#include "stdafx.h"
#include <winsock2.h>
#include "mdhcp.h"
#include "scope.h"
/////////////////////////////////////////////////////////////////////////////
// Constructor
CMDhcpScope::CMDhcpScope() : m_pFTM(NULL), m_fLocal(FALSE)
{
LOG((MSP_TRACE, "CMDhcpScope constructor: enter"));
LOG((MSP_TRACE, "CMDhcpScope constructor: exit"));
}
/////////////////////////////////////////////////////////////////////////////
// Called by our creator only -- not part of IMDhcpScope.
HRESULT CMDhcpScope::Initialize(
MCAST_SCOPE_ENTRY scope,
BOOL fLocal
)
{
LOG((MSP_TRACE, "CMDhcpScope::Initialize: enter"));
HRESULT hr = CoCreateFreeThreadedMarshaler( GetControllingUnknown(),
& m_pFTM );
if ( FAILED(hr) )
{
LOG((MSP_INFO, "CMDhcpScope::Initialize - "
"create FTM returned 0x%08x; exit", hr));
return hr;
}
m_fLocal = fLocal;
// elementwise copy...
m_scope = scope;
// except for wide character pointer, which points to a string that will
// get deleted shortly. We need to make a copy of that string.
// (We allocate too many bytes here -- better safe than sorry. :)
m_scope.ScopeDesc.Buffer = new WCHAR[m_scope.ScopeDesc.MaximumLength + 1];
if (m_scope.ScopeDesc.Buffer == NULL)
{
LOG((MSP_ERROR, "scope Initialize: out of memory for buffer copy"));
return E_OUTOFMEMORY;
}
lstrcpynW(m_scope.ScopeDesc.Buffer,
scope.ScopeDesc.Buffer,
m_scope.ScopeDesc.MaximumLength);
LOG((MSP_TRACE, "CMDhcpScope::Initialize: exit"));
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// Destructors
void CMDhcpScope::FinalRelease(void)
{
LOG((MSP_TRACE, "CMDhcpScope::FinalRelease: enter"));
// this is our private copy of the string.
delete m_scope.ScopeDesc.Buffer;
if ( m_pFTM )
{
m_pFTM->Release();
}
LOG((MSP_TRACE, "CMDhcpScope::FinalRelease: exit"));
}
CMDhcpScope::~CMDhcpScope()
{
LOG((MSP_TRACE, "CMDhcpScope destructor: enter"));
LOG((MSP_TRACE, "CMDhcpScope destructor: exit"));
}
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// IMDhcpScope
//
// This interface is obtained by calling IMDhcp::EnumerateScopes or
// IMDhcp::get_Scopes. It encapsulates all the properties of a multicast
// scope. You can use the methods of this interface to get information about
// the scope. This is a "read-only" interface in that it has "get" methods
// but no "put" methods.
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
// IMDhcpScope::get_ScopeID
//
// Parameters
// pID [out] Pointer to a long that will receive the ScopeID of this
// scope, which is the ID that was assigned to this scope
// when it was configured on the MDHCP server.
//
// Return Values
// S_OK Success
// E_POINTER The caller passed in an invalid pointer argument
//
// Description
// Use this method to obtain the ScopeID associated with this scope. The
// ScopeID and ServerID are needed to select this scope in subsequent
// calls to IMDhcp::RequestAddress, IMDhcp::RenewAddress, or
// IMDhcp::ReleaseAddress.
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CMDhcpScope::get_ScopeID(
long *pID
)
{
LOG((MSP_TRACE, "CMDhcpScope::get_ScopeID: enter"));
if ( IsBadWritePtr(pID, sizeof(long)) )
{
LOG((MSP_ERROR, "get_ScopeID: bad pointer passed in"));
return E_POINTER;
}
//
// Stored in network byte order -- we convert to host byte order
// here in order to be UI friendly
//
*pID = ntohl( m_scope.ScopeCtx.ScopeID.IpAddrV4 );
LOG((MSP_TRACE, "CMDhcpScope::get_ScopeID: exit"));
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
// IMDhcpScope::get_ServerID
//
// Parameters
// pID [out] Pointer to a long that will receive the ServerID of this
// scope, which is the ID that was assigned to the MDHCP
// server that published this scope at the time that the
// MDHCP server was configured.
//
// Return Values
// S_OK Success
// E_POINTER The caller passed in an invalid pointer argument
//
// Description
// Use this method to obtain the ServerID associated with this scope.
// The ServerID is provided for informational purposes only; it is not
// required as input to any of the methods in these interfaces.
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CMDhcpScope::get_ServerID(
long *pID
)
{
LOG((MSP_TRACE, "CMDhcpScope::get_ServerID: enter"));
if ( IsBadWritePtr(pID, sizeof(long)) )
{
LOG((MSP_ERROR, "get_ServerID: bad pointer passed in"));
return E_POINTER;
}
*pID = m_scope.ScopeCtx.ServerID.IpAddrV4;
LOG((MSP_TRACE, "CMDhcpScope::get_ServerID: exit"));
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
// IMDhcpScope::get_InterfaceID
//
// Parameters
// pID [out] Pointer to a long that will receive the InterfaceID of this
// scope, which identifies the interface on which the server
// that published this scope resides. This is normally the
// network address of the interface.
//
// Return Values
// S_OK Success
// E_POINTER The caller passed in an invalid pointer argument
//
// Description
// Use this method to obtain the ServerID associated with this scope. The
// InterfaceID is provided for informational purposes only; it is not
// required as input to any of the methods in these interfaces. However,
// it may factor into the application's (or the user's) decision as to
// which scope to use when requesting an address. This is because, in a
// multi-homed scenario, using a multicast address on one network that was
// obtained from a server on another network may cause address conflicts.
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CMDhcpScope::get_InterfaceID(
long * pID
)
{
LOG((MSP_TRACE, "CMDhcpScope::get_InterfaceID - enter"));
if ( IsBadWritePtr(pID, sizeof(long)) )
{
LOG((MSP_ERROR, "CMDhcpScope::get_InterfaceID - "
"bad pointer passed in"));
return E_POINTER;
}
*pID = m_scope.ScopeCtx.Interface.IpAddrV4;
LOG((MSP_TRACE, "CMDhcpScope::get_InterfaceID - exit"));
return S_OK;
}
//////////////////////////////////////////////////////////////////////////////
// IMDhcpScope::get_ScopeDescription
//
// Parameters
// ppAddress [out] Pointer to a BSTR (size-tagged Unicode string pointer)
// that will receive a description of this scope. The
// description was established when this scope was
// configured on the MDHCP server.
//
// Return Values
// S_OK Success
// E_POINTER The caller passed in an invalid pointer argument
// E_OUTOFMEMORY Not enough memory to allocate the string
//
// Description
// Use this method to obtain a textual description associated with this
// scope. The description is used only for clarifying the purpose or
// meaning of a scope and is not required as input to any of the methods
// in these interfaces.
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CMDhcpScope::get_ScopeDescription(
BSTR *ppAddress
)
{
LOG((MSP_TRACE, "CMDhcpScope::get_ScopeDescription: enter"));
if ( IsBadWritePtr(ppAddress, sizeof(BSTR)) )
{
LOG((MSP_ERROR, "get_ScopeDescription: bad pointer passed in"));
return E_POINTER;
}
// This allocates space on OLE's heap, copies the wide character string
// to that space, fille in the BSTR length field, and returns a pointer
// to the WCHAR array part of the BSTR.
*ppAddress = SysAllocString(m_scope.ScopeDesc.Buffer);
if ( *ppAddress == NULL )
{
LOG((MSP_ERROR, "get_ScopeDescription: out of memory in string "
"allocation"));
return E_OUTOFMEMORY;
}
LOG((MSP_TRACE, "CMDhcpScope::get_ScopeDescription: exit"));
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CMDhcpScope::get_TTL(
long * plTtl
)
{
LOG((MSP_TRACE, "CMDhcpScope::get_TTL - enter"));
if ( IsBadWritePtr( plTtl, sizeof(long) ) )
{
LOG((MSP_ERROR, "get_TTL: bad pointer passed in - exit E_POINTER"));
return E_POINTER;
}
*plTtl = m_scope.TTL;
LOG((MSP_TRACE, "CMDhcpScope::get_TTL - exit S_OK"));
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////
// public method not on any interface
//
HRESULT CMDhcpScope::GetLocal(BOOL * pfLocal)
{
LOG((MSP_TRACE, "CMDhcpScope::GetLocal: enter"));
_ASSERTE( ! IsBadWritePtr( pfLocal, sizeof(BOOL) ) );
*pfLocal = m_fLocal;
LOG((MSP_TRACE, "CMDhcpScope::GetLocal: exit S_OK"));
return S_OK;
}
// eof