Esempio n. 1
0
AAFRESULT STDMETHODCALLTYPE
ImplAAFTypeDefArray::GetCArray (
								ImplAAFPropertyValue * pPropVal,
								aafMemPtr_t pData,
								aafUInt32 dataSize)
{
	if (! pPropVal)
		return AAFRESULT_NULL_PARAM;
	
	if (! pData)
		return AAFRESULT_NULL_PARAM;
	
	if (! IsRegistered ())
		return AAFRESULT_NOT_REGISTERED;
	
	// Get the property value's embedded type and 
	// check if it's the same as the base type.
	ImplAAFTypeDefSP	pIncomingType;
	if( AAFRESULT_FAILED( pPropVal->GetType( &pIncomingType ) ) )
		return AAFRESULT_BAD_TYPE;
	ASSERTU (pIncomingType);
	if( (ImplAAFTypeDef *)pIncomingType != this )
		return AAFRESULT_BAD_TYPE;

	ImplAAFTypeDefSP pBaseType;
	HRESULT hr = GetType (&pBaseType);
	
	ASSERTU (pBaseType->IsFixedSize ());
	pBaseType->AttemptBuiltinRegistration ();
	ASSERTU (pBaseType->IsRegistered ());

	
  ImplAAFRefArrayValue* pRefArray = dynamic_cast<ImplAAFRefArrayValue*>(pPropVal);
  if (NULL != pRefArray)
  {
    // This interface is not type-safe for accessing objects! There is also no
    // mechanism in place to convert between a buffer pointer and an array
    // of interface pointers; this convertion would not be necessary for
    // arrays of non-objects.
    return AAFRESULT_BAD_TYPE;
  }


	aafUInt32 elemSize = pBaseType->NativeSize ();
	aafUInt32 elemCount = pvtCount (pPropVal);
	aafUInt32 propSize = elemSize * elemCount;
	
	if (dataSize < propSize)
		return AAFRESULT_BAD_SIZE;
	
	ImplAAFPropValData * pvd = 0;
	ASSERTU (pPropVal);
	pvd = dynamic_cast<ImplAAFPropValData*> (pPropVal);
	ASSERTU (pvd);
	
	aafUInt32 bitsSize;
	hr = pvd->GetBitsSize (&bitsSize);
	if (AAFRESULT_FAILED (hr))
		return hr;
	ASSERTU (bitsSize >= propSize);
	
	aafMemPtr_t pBits = 0;
	hr = pvd->GetBits (&pBits);
	if (AAFRESULT_FAILED (hr))
		return hr;
	ASSERTU (pBits);
	
	memcpy (pData, pBits, propSize);
	return AAFRESULT_SUCCESS;
}