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

380 lines
9 KiB
C++

/*
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
blbmedia.cpp
Abstract:
Implementation of CSdpblbApp and DLL registration.
Author:
*/
#include "stdafx.h"
#include "blbgen.h"
#include "sdpblb.h"
#include "blbmedia.h"
#include "blbreg.h"
#include "addrgen.h"
// audio string with a trailing blank for the audio media blob
const TCHAR AUDIO_TSTR[] = _T("audio ");
const USHORT AUDIO_TSTRLEN = (sizeof(AUDIO_TSTR)/sizeof(TCHAR) -1);
// static variables
const IID &MEDIA::ELEM_IF_ID = IID_ITMedia;
// uses GetElement() to access the sdp media instance - calls ENUM_ELEMENT::GetElement()
CSdpConferenceBlob *
MEDIA::GetConfBlob(
)
{
return m_ConfBlob;
}
HRESULT
MEDIA::Init(
IN CSdpConferenceBlob &ConfBlob
)
{
// check if the registry entries were read without errors
if ( !SDP_REG_READER::IsValid() )
{
return HRESULT_FROM_ERROR_CODE(SDP_REG_READER::GetErrorCode());
}
// allocate an audio port
// using random values for lease period since its not being interpreted
MSA_PORT_GROUP PortGroup;
PortGroup.PortType = AUDIO_PORT;
WORD FirstAudioPort;
// allocate video port
if ( !MSAAllocatePorts(&PortGroup, FALSE, 1, &FirstAudioPort) )
{
return HRESULT_FROM_ERROR_CODE(GetLastError());
}
// create a defalt sdp media instance
SDP_MEDIA *SdpMedia;
try
{
SdpMedia = new SDP_MEDIA();
}
catch(...)
{
SdpMedia = NULL;
}
BAIL_IF_NULL(SdpMedia, E_OUTOFMEMORY);
// allocate memory for the audio media blob
TCHAR *SdpMediaBlob;
try
{
SdpMediaBlob = new TCHAR[
SDP_REG_READER::GetMediaTemplateLen() +
AUDIO_TSTRLEN +
MAX_PORT_STRLEN
];
}
catch(...)
{
SdpMediaBlob = NULL;
}
if ( NULL == SdpMediaBlob )
{
delete SdpMedia;
return E_OUTOFMEMORY;
}
// copy AUDIO_TSTR into the sdp media blob
lstrcpy(SdpMediaBlob, AUDIO_TSTR);
TCHAR *BlobPtr = SdpMediaBlob;
// use the media template to create a media blob
// parse the media blob to initialize the sdp media instance
// if not successful, delete the sdp media instance and return error
if ( (0 == _stprintf(SdpMediaBlob+AUDIO_TSTRLEN, SDP_REG_READER::GetMediaTemplate(), FirstAudioPort)) ||
(!SdpMedia->ParseLine(BlobPtr)) )
{
delete SdpMedia;
delete SdpMediaBlob;
return HRESULT_FROM_ERROR_CODE(GetLastError());
}
delete SdpMediaBlob;
m_ConfBlob = &ConfBlob;
ENUM_ELEMENT<SDP_MEDIA>::SuccessInit(*SdpMedia, TRUE);
ITConnectionImpl::SuccessInit(*SdpMedia);
ITAttributeListImpl::SuccessInit(SdpMedia->GetAttributeList());
return S_OK;
}
STDMETHODIMP MEDIA::get_MediaName(BSTR * pVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetName().GetBstrCopy(pVal);
}
STDMETHODIMP MEDIA::put_MediaName(BSTR newVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetName().SetBstr(newVal);
}
STDMETHODIMP MEDIA::get_StartPort(LONG * pVal)
{
BAIL_IF_NULL(pVal, E_INVALIDARG);
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
// vb doesn't take a USHORT (16bit unsigned value)
*pVal = (LONG)GetElement().GetStartPort().GetValue();
return S_OK;
}
STDMETHODIMP MEDIA::get_NumPorts(LONG * pVal)
{
BAIL_IF_NULL(pVal, E_INVALIDARG);
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
// vb doesn't take a USHORT (16bit unsigned value)
*pVal = (LONG)(GetElement().GetNumPorts().IsValid() ? GetElement().GetNumPorts().GetValue() : 1);
return S_OK;
}
STDMETHODIMP MEDIA::SetPortInfo(LONG StartPort, LONG NumPorts)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
// validate the start port and num ports value - they should be USHORT values [0..2**16-1]
if ( !((0 <= StartPort) && (USHORT(-1) > StartPort) && (0 <= NumPorts) && (USHORT(-1) > NumPorts)) )
{
return E_INVALIDARG;
}
return GetElement().SetPortInfo((USHORT)StartPort, (USHORT)NumPorts);
}
STDMETHODIMP MEDIA::get_TransportProtocol(BSTR * pVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetProtocol().GetBstrCopy(pVal);
}
STDMETHODIMP MEDIA::put_TransportProtocol(BSTR newVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetProtocol().SetBstr(newVal);
}
STDMETHODIMP MEDIA::get_FormatCodes(VARIANT /*SAFEARRAY (BSTR)*/ * pVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetFormatCodeList().GetSafeArray(pVal);
}
STDMETHODIMP MEDIA::put_FormatCodes(VARIANT /*SAFEARRAY (BSTR)*/ newVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetFormatCodeList().SetSafeArray(newVal);
}
STDMETHODIMP MEDIA::get_MediaTitle(BSTR * pVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetTitle().GetBstrCopy(pVal);
}
STDMETHODIMP MEDIA::put_MediaTitle(BSTR newVal)
{
CLock Lock(g_DllLock);
ASSERT(GetElement().IsValid());
return GetElement().GetTitle().SetBstr(newVal);
}
#define INTERFACEMASK (0xff0000)
typedef IDispatchImpl<ITMediaVtbl<MEDIA>, &IID_ITMedia, &LIBID_SDPBLBLib> CMedia;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// MEDIA::GetIDsOfNames
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP MEDIA::GetIDsOfNames(REFIID riid,
LPOLESTR* rgszNames,
UINT cNames,
LCID lcid,
DISPID* rgdispid
)
{
HRESULT hr = DISP_E_UNKNOWNNAME;
//
// See if the requsted method belongs to the default interface
//
hr = CMedia::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
if (SUCCEEDED(hr))
{
rgdispid[0] |= IDISPMEDIA;
return hr;
}
//
// If not, then try the ITConnection base class
//
hr = ITConnectionImpl::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
if (SUCCEEDED(hr))
{
rgdispid[0] |= IDISPCONNECTION;
return hr;
}
//
// If not, then try the ITAttributeList base class
//
hr = ITAttributeListImpl::GetIDsOfNames(riid, rgszNames, cNames, lcid, rgdispid);
if (SUCCEEDED(hr))
{
rgdispid[0] |= IDISPATTRLIST;
return hr;
}
return hr;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
//
// MEDIA::Invoke
//
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
STDMETHODIMP MEDIA::Invoke(DISPID dispidMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS* pdispparams,
VARIANT* pvarResult,
EXCEPINFO* pexcepinfo,
UINT* puArgErr
)
{
HRESULT hr = DISP_E_MEMBERNOTFOUND;
DWORD dwInterface = (dispidMember & INTERFACEMASK);
//
// Call invoke for the required interface
//
switch (dwInterface)
{
case IDISPMEDIA:
{
hr = CMedia::Invoke(dispidMember,
riid,
lcid,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr
);
break;
}
case IDISPCONNECTION:
{
hr = ITConnectionImpl::Invoke(dispidMember,
riid,
lcid,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr
);
break;
}
case IDISPATTRLIST:
{
hr = ITAttributeListImpl::Invoke(dispidMember,
riid,
lcid,
wFlags,
pdispparams,
pvarResult,
pexcepinfo,
puArgErr
);
break;
}
} // end switch (dwInterface)
return hr;
}