|
|
/*
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; }
|