ImplAAFContentStorage::~ImplAAFContentStorage () { // Cleanup the persistent data... // Release the essence data OMStrongReferenceSetIterator<OMMaterialIdentification, ImplAAFEssenceData>essenceData(_essenceData); while(++essenceData) { ImplAAFEssenceData *pData = essenceData.clearValue(); if (pData) { pData->ReleaseReference(); pData = 0; } } // Release the mobs OMStrongReferenceSetIterator<OMMaterialIdentification, ImplAAFMob>mobs(_mobs); while(++mobs) { ImplAAFMob *pMob = mobs.clearValue(); if (pMob) { pMob->ReleaseReference(); pMob = 0; } } }
AAFRESULT STDMETHODCALLTYPE ImplAAFContentStorage::CountMobs (aafMobKind_t mobKind, aafNumSlots_t *pNumMobs) { aafUInt32 siz; ImplEnumAAFMobs *mobEnum = NULL; aafSearchCrit_t criteria; AAFRESULT hr = AAFRESULT_SUCCESS; ImplAAFMob *aMob = NULL; if(pNumMobs == NULL) return AAFRESULT_NULL_PARAM; if(mobKind == kAAFAllMob) { siz = _mobs.count(); } else { criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = mobKind; hr = GetMobs (&criteria,&mobEnum); siz = 0; do { hr = mobEnum->NextOne (&aMob); if(hr == AAFRESULT_SUCCESS) { siz++; ASSERTU (aMob); aMob->ReleaseReference(); aMob = NULL; } } while(hr == AAFRESULT_SUCCESS); if(hr == AAFRESULT_NO_MORE_OBJECTS) hr = AAFRESULT_SUCCESS; if (mobEnum) { mobEnum->ReleaseReference(); mobEnum = 0; } } *pNumMobs = siz; return hr; }
HRESULT STDMETHODCALLTYPE CAAFSourceClip::ResolveRef (IAAFMob ** ppMob) { HRESULT hr; ImplAAFSourceClip * ptr; ImplAAFRoot * pO; pO = GetRepObject (); assert (pO); ptr = static_cast<ImplAAFSourceClip*> (pO); assert (ptr); // // set up for ppMob // ImplAAFMob * internalppMob = NULL; ImplAAFMob ** pinternalppMob = NULL; if (ppMob) { pinternalppMob = &internalppMob; } try { hr = ptr->ResolveRef (pinternalppMob); } 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 ppMob // if (SUCCEEDED(hr)) { IUnknown *pUnknown; HRESULT hStat; if (internalppMob) { pUnknown = static_cast<IUnknown *> (internalppMob->GetContainer()); hStat = pUnknown->QueryInterface(IID_IAAFMob, (void **)ppMob); assert (SUCCEEDED (hStat)); //pUnknown->Release(); internalppMob->ReleaseReference(); // We are through with this pointer. } } return hr; }
AAFRESULT STDMETHODCALLTYPE ImplAAFEssenceData::GetFileMob (ImplAAFSourceMob ** ppFileMob) { AAFRESULT result = AAFRESULT_SUCCESS; ImplAAFMob *pMob = NULL; ImplAAFSourceMob *pSourceMob = NULL; ImplAAFEssenceDescriptor *pEssenceDescriptor = NULL; ImplAAFHeader *pHeader = NULL; aafMobID_t mobID; if(NULL == ppFileMob) return(AAFRESULT_NULL_PARAM); XPROTECT() { CHECK(GetFileMobID(&mobID)); // Does a mob with the ID already exist? If not, return error. // NOTE: Will return AAFRESULT_OBJECT_NOT_PERSISTENT if this object has // not been appended to to the file. CHECK(MyHeadObject(&pHeader)); CHECK(pHeader->LookupMob(mobID, &pMob)); // This should be a valid file mob which is a file mob. pSourceMob = dynamic_cast<ImplAAFSourceMob *>(pMob); if (NULL == pSourceMob) RAISE(AAFRESULT_NOT_FILEMOB); // Does the source mob contain a file descriptor? CHECK(pSourceMob->GetEssenceDescriptor(&pEssenceDescriptor)); if (dynamic_cast<ImplAAFFileDescriptor *>(pEssenceDescriptor)) { (*ppFileMob) = pSourceMob; pSourceMob->AcquireReference(); } } /* XPROTECT */ XEXCEPT { // save the error code. result = (XCODE()); NO_PROPAGATE(); } XEND; // cleanup // Note: pMob and pSourceMob are temp and should not be released. if (pEssenceDescriptor) { pEssenceDescriptor->ReleaseReference(); pEssenceDescriptor = NULL; } if (pMob) { pMob->ReleaseReference(); pMob = NULL; } if (pHeader) { pHeader->ReleaseReference(); pHeader = NULL; } return(result); }
AAFRESULT STDMETHODCALLTYPE ImplAAFEssenceData::SetFileMob (ImplAAFSourceMob * pFileMob) { AAFRESULT result = AAFRESULT_SUCCESS; ImplAAFMob *pMob = NULL; ImplAAFSourceMob *pSourceMob = NULL; ImplAAFEssenceDescriptor *pEssenceDescriptor = NULL; ImplAAFFileDescriptor *pFileDescriptor = NULL; ImplAAFHeader *pHeader = NULL; aafMobID_t mobID; if(NULL == pFileMob) return(AAFRESULT_NULL_PARAM); XPROTECT() { CHECK(pFileMob->GetMobID(&mobID)); // move to ImplAAFContentStorage::AppendEssenceData(). // Does a mob with the ID already exist? If not, return error CHECK(pFileMob->MyHeadObject(&pHeader)); CHECK(pHeader->LookupMob(mobID, &pMob)); // Make sure the mob is a valid File source mob??? pSourceMob = dynamic_cast<ImplAAFSourceMob *>(pMob); if (NULL == pSourceMob) RAISE(AAFRESULT_INVALID_FILE_MOB); // Must result = pSourceMob->GetEssenceDescriptor(&pEssenceDescriptor); if (AAFRESULT_SUCCESS != result) RAISE(AAFRESULT_INVALID_FILE_MOB); pFileDescriptor = dynamic_cast<ImplAAFFileDescriptor *>(pEssenceDescriptor); if (NULL == pFileDescriptor) RAISE(AAFRESULT_INVALID_FILE_MOB); // The mob id refers to a valid file source mob so we can save // the id. _fileMobID = mobID; } /* XPROTECT */ XEXCEPT { // save the error code. result = (XCODE()); NO_PROPAGATE(); } XEND; // cleanup if (pEssenceDescriptor) { pEssenceDescriptor->ReleaseReference(); pEssenceDescriptor = NULL; } if (pMob) { pMob->ReleaseReference(); pMob = NULL; } if (pHeader) { pHeader->ReleaseReference(); pHeader = NULL; } return(result); }