HRESULT STDMETHODCALLTYPE CEnumAAFFileDescriptors::Next (aafUInt32 count, IAAFFileDescriptor ** ppFileDescriptors, aafUInt32 * pNumFetched) { HRESULT hr; ImplEnumAAFFileDescriptors * ptr; ImplAAFRoot * pO; pO = GetRepObject (); assert (pO); ptr = static_cast<ImplEnumAAFFileDescriptors*> (pO); assert (ptr); // // set up for ppFileDescriptors // ImplAAFFileDescriptor ** internalppFileDescriptors = NULL; assert (count >= 0); internalppFileDescriptors = new ImplAAFFileDescriptor*[count]; assert (internalppFileDescriptors); ImplAAFFileDescriptor ** pinternalppFileDescriptors = NULL; if (ppFileDescriptors) { pinternalppFileDescriptors = internalppFileDescriptors; } try { hr = ptr->Next (count, pinternalppFileDescriptors, pNumFetched); } catch (OMException& e) { // OMExceptions should be handled by the impl code. However, if an // unhandled OMException occurs, control reaches here. We must not // allow the unhandled exception to reach the client code, so we // turn it into a failure status code. // // If the OMException contains an HRESULT, it is returned to the // client, if not, AAFRESULT_UHANDLED_EXCEPTION is returned. // hr = OMExceptionToResult(e, AAFRESULT_UNHANDLED_EXCEPTION); } catch (OMAssertionViolation &) { // Control reaches here if there is a programming error in the // impl code that was detected by an assertion violation. // We must not allow the assertion to reach the client code so // here we turn it into a failure status code. // hr = AAFRESULT_ASSERTION_VIOLATION; } catch (...) { // We CANNOT throw an exception out of a COM interface method! // Return a reasonable exception code. // hr = AAFRESULT_UNEXPECTED_EXCEPTION; } // // cleanup for ppFileDescriptors // if (SUCCEEDED(hr)||hr==AAFRESULT_NO_MORE_OBJECTS) { IUnknown *pUnknown; HRESULT hStat; aafUInt32 localIdx; assert (count >= 0); for (localIdx = 0; localIdx < *pNumFetched; localIdx++) { pUnknown = static_cast<IUnknown *> (internalppFileDescriptors[localIdx]->GetContainer()); hStat = pUnknown->QueryInterface(IID_IAAFFileDescriptor, (void **)(ppFileDescriptors+localIdx)); assert (SUCCEEDED (hStat)); //pUnknown->Release(); internalppFileDescriptors[localIdx]->ReleaseReference(); // We are through with this pointer. } } delete[] internalppFileDescriptors; internalppFileDescriptors = 0; return hr; }