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