Copying ltmmMediaType Attributes and Data for C++

The following code demonstrates how to copy a media type's attributes and data to another media type.

// include the LEAD Multimedia TOOLKIT header
#include "ltmm.h" 

/////////////////////////////////////////////////////////////////
// CopyMediaTypeAttributes
// copies data and attributes from one media type to another
// pDest - destination media type interface
// pSource - source media type interface
//
HRESULT CopyMediaTypeAttributes(IltmmMediaTypeDisp* pDest, IltmmMediaTypeDisp* pSource)
{
   HRESULT hr;
   VARIANT_BOOL f;
   long l;
   BSTR bstr;
   long cbData;
   VARIANT var;

   // return error if NULL
   if(!pSource || !pDest)
      return E_POINTER;

   // get the format data size
   hr = pSource->get_FormatSize(&cbData);
   if(FAILED(hr))
      return hr;

   // any format data
   if(cbData)
   {
      // yes, then copy away
      hr = pSource->GetFormatData (cbData, &var);
      if(FAILED(hr))
         return hr;
      hr = pDest->SetFormatData (cbData, var);
      VariantClear(&var);
      if(FAILED(hr))
         return hr;
   }
   else
   {
      // no, just set the dest to zero
      hr = pDest->put_FormatSize (0);
      if(FAILED(hr))
         return hr;
   }

   // copy type
   bstr = NULL;
   pSource->get_Type (&bstr);
   pDest->put_Type (bstr);
   ::SysFreeString(bstr);

   // copy subtype
   bstr = NULL;
   pSource->get_Subtype (&bstr);
   pDest->put_Subtype (bstr);
   ::SysFreeString(bstr);

   // copy formattype
   bstr = NULL;
   pSource->get_FormatType(&bstr);
   pDest->put_FormatType (bstr);
   ::SysFreeString(bstr);

   // copy fixedsizesamples
   f = VARIANT_FALSE;
   pSource->get_FixedSizeSamples (&f);
   pDest->put_FixedSizeSamples (f);

   // copy temporalcompression
   f = VARIANT_FALSE;
   pSource->get_TemporalCompression (&f);
   pDest->put_TemporalCompression (f);

   // copy samplesize
   l = 0;
   pSource->get_SampleSize (&l);
   pDest->put_SampleSize (l);

   return S_OK;
}