windows-nt/Source/XPSP1/NT/net/tapi/skywalker/sdpblb/blbatt.cpp
2020-09-26 16:20:57 +08:00

141 lines
3.2 KiB
C++

/*
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
blbatt.cpp
Abstract:
Author:
*/
#include "stdafx.h"
#include "blbgen.h"
#include "blbatt.h"
// variants are validated in the get/set safearray methods
// bstrs are validated in the GetBstrCopy and SetBstr methods. they may also
// be optionally validated before taking any action, if there is a possibility
// of having to roll back some of the work done on finding them invalid
STDMETHODIMP ITAttributeListImpl::get_Count(LONG * pVal)
{
BAIL_IF_NULL(pVal, E_INVALIDARG);
CLock Lock(g_DllLock);
ASSERT(NULL != m_SdpAttributeList);
*pVal = (LONG)m_SdpAttributeList->GetSize();
return S_OK;
}
STDMETHODIMP ITAttributeListImpl::get_Item(LONG Index, BSTR * pVal)
{
CLock Lock(g_DllLock);
ASSERT(NULL != m_SdpAttributeList);
// vb indices are in the range [1..GetSize()]
if ( !((1 <= Index) && (Index <= m_SdpAttributeList->GetSize())) )
{
return E_INVALIDARG;
}
// adjust the index to the range [0..(GetSize()-1)]
return ((SDP_REQD_BSTRING_LINE *)m_SdpAttributeList->GetAt(Index-1))->GetBstrCopy(pVal);
}
STDMETHODIMP ITAttributeListImpl::Add(LONG Index, BSTR Attribute)
{
BAIL_IF_NULL(Attribute, E_INVALIDARG);
CLock Lock(g_DllLock);
ASSERT(NULL != m_SdpAttributeList);
// index should be in the range [1..GetSize()+1]
if ( !((1 <= Index) && (Index <= (m_SdpAttributeList->GetSize()+1))) )
{
return E_INVALIDARG;
}
// create an attribute line
SDP_REQD_BSTRING_LINE *AttributeLine =
(SDP_REQD_BSTRING_LINE *)m_SdpAttributeList->CreateElement();
if( NULL == AttributeLine )
{
return E_OUTOFMEMORY;
}
// set the passed in attribute in the attribute line
HRESULT ToReturn = AttributeLine->SetBstr(Attribute);
if ( FAILED(ToReturn) )
{
delete AttributeLine;
return ToReturn;
}
// insert the attribute line, shift elements with equal or higher indices forwards
m_SdpAttributeList->InsertAt(Index-1, AttributeLine);
return S_OK;
}
STDMETHODIMP ITAttributeListImpl::Delete(LONG Index)
{
CLock Lock(g_DllLock);
ASSERT(NULL != m_SdpAttributeList);
// vb indices are in the range [1..GetSize()]
if ( !((1 <= Index) && (Index <= m_SdpAttributeList->GetSize())) )
{
return E_INVALIDARG;
}
// adjust the index to the range [0..(GetSize()-1)]
// delete the attribute line, remove the ptr from the array; shifting elements with higher
// index lower
delete m_SdpAttributeList->GetAt(Index-1);
m_SdpAttributeList->RemoveAt(Index-1);
return S_OK;
}
STDMETHODIMP ITAttributeListImpl::get_AttributeList(VARIANT /*SAFEARRAY(BSTR)*/ * pVal)
{
CLock Lock(g_DllLock);
ASSERT(NULL != m_SdpAttributeList);
return m_SdpAttributeList->GetSafeArray(pVal);
}
STDMETHODIMP ITAttributeListImpl::put_AttributeList(VARIANT /*SAFEARRAY(BSTR)*/ newVal)
{
CLock Lock(g_DllLock);
ASSERT(NULL != m_SdpAttributeList);
if ( NULL == V_ARRAY(&newVal) )
{
m_SdpAttributeList->Reset();
return S_OK;
}
return m_SdpAttributeList->SetSafeArray(newVal);
}