static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFFile * pFile = NULL; bool bFileOpen = false; IAAFHeader * pHeader = NULL; aafNumSlots_t numMobs, i; HRESULT hr = S_OK; HRESULT localhr = S_OK; IEnumAAFMobs *mobIter = NULL; IEnumAAFMobs *cloneMobIter = NULL; IAAFMob *aMob = NULL; IAAFMob **mobArray = NULL; aafSearchCrit_t criteria; aafUInt32 numFetched = 0; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); // Make sure that we have one master, one file, and one composition (three total) checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression (3 == numMobs, AAFRESULT_TEST_FAILED); criteria.searchTag = kAAFNoSearch; checkResult(pHeader->GetMobs (&criteria, &mobIter)); /* Test the Reset method *******************************/ if (mobIter->Reset() == AAFRESULT_SUCCESS) cout<< " Reset() ... Passed" << endl; else { cout<< " Reset() ... Failed!!!" << endl; hr = AAFRESULT_TEST_FAILED; } /* Test the NextOne method ******************************/ // Call NextOne once for each mob for a total of numMobs times for (i=0; i<numMobs; i++) { if (mobIter->NextOne(&aMob) == AAFRESULT_SUCCESS) { aMob->Release(); aMob = NULL; } else localhr = AAFRESULT_TEST_FAILED; } // Make sure we are at the end if (mobIter->NextOne(&aMob) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); // this should return AAFRESULT_NULL_PARAM if (mobIter->NextOne(NULL) != AAFRESULT_NULL_PARAM) localhr = AAFRESULT_TEST_FAILED; if (SUCCEEDED(localhr)) cout<< " NextOne() ... Passed" << endl; else { cout<< " NextOne() ... Failed!!!" << endl; hr = AAFRESULT_TEST_FAILED; } /* Test the Skip method ******************************/ localhr = S_OK; mobIter->Reset(); // skip over each Mob one at a time. for (i=0; i<numMobs; i++) if (mobIter->Skip(1) != AAFRESULT_SUCCESS) localhr = AAFRESULT_TEST_FAILED; // Make sure we are at the end. if (mobIter->Skip(1) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); // Skip over multiple Mobs at a time. for (i=2; i<=numMobs; i++) { if (mobIter->Skip(i) != AAFRESULT_SUCCESS) localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); } // Make sure we are at the end. if (mobIter->Skip(numMobs+1) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; if (SUCCEEDED(localhr)) cout<< " Skip() ... Passed" << endl; else { cout<< " Skip() ... Failed!!!" << endl; hr = AAFRESULT_TEST_FAILED; } /* Next() ******************************************/ mobArray = new IAAFMob *[numMobs]; localhr = S_OK; numFetched = 1; // Iterate thru the Mobs using Next doing 1 at a time mobIter->Reset(); for ( i=0; i<numMobs ;i++) { if (mobIter->Next(1, &aMob, &numFetched) == AAFRESULT_SUCCESS) { aMob->Release(); aMob = NULL; if (1 != numFetched) localhr = AAFRESULT_TEST_FAILED; } else localhr = AAFRESULT_TEST_FAILED; } // Make sure we are at the end if (mobIter->Next(1, &aMob, &numFetched) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; if(numFetched != 0) localhr = AAFRESULT_TEST_FAILED; // Test the Next method filling out an array of Mobs numFetched = 0; mobIter->Reset(); for ( i=2; i<=numMobs ;i++) { if (mobIter->Next(i, mobArray, &numFetched) == AAFRESULT_SUCCESS) { if (i != numFetched) localhr = AAFRESULT_TEST_FAILED; for (i = 0; i < numFetched; i++) if (mobArray[i] != NULL) // should have been set { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; } else localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); } // Make sure we can't get more Mobs than numMobs if (mobIter->Next(i+1, mobArray, &numFetched) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; if (numMobs != numFetched) localhr = AAFRESULT_TEST_FAILED; for (i = 0; i < numMobs; i++) if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); mobIter->Skip(2); // Make sure we can't go past the end to fill the array if (mobIter->Next(numMobs, mobArray, &numFetched) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; if ((numMobs-2) != numFetched) localhr = AAFRESULT_TEST_FAILED; for (i = 0; i < numMobs-2; i++) if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); // Make sure it returns AAFRESULT_NULL_PARAM if (mobIter->Next(1, NULL, &numFetched) != AAFRESULT_NULL_PARAM) localhr = AAFRESULT_TEST_FAILED; // Make sure it returns E_INVALIDARG if (mobIter->Next(1, mobArray, &numFetched) != AAFRESULT_SUCCESS) localhr = AAFRESULT_TEST_FAILED; else { for (i = 0; i < numFetched; i++) if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; } if (SUCCEEDED(localhr)) cout<< " Next() ... Passed" << endl; else { cout<< " Next() ... Failed!!!" << endl; hr = AAFRESULT_TEST_FAILED; } /* Clone() ************************************/ // Test the Clone method with with enumerator at begining localhr = S_OK; mobIter->Reset(); if (mobIter->Clone(&cloneMobIter) == AAFRESULT_SUCCESS) { for (i=0; i < numMobs; i++) { if (cloneMobIter->NextOne(&aMob) == AAFRESULT_SUCCESS) { aMob->Release(); aMob = NULL; } else localhr = AAFRESULT_TEST_FAILED; } if (cloneMobIter->NextOne(&aMob) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; cloneMobIter->Reset(); if (cloneMobIter->Next(numMobs, mobArray, &numFetched) != AAFRESULT_SUCCESS) localhr = AAFRESULT_TEST_FAILED; if (numMobs != numFetched) localhr = AAFRESULT_TEST_FAILED; for (i = 0; i < numMobs; i++) { if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; } cloneMobIter->Reset(); if (cloneMobIter->Next(numMobs+1, mobArray, &numFetched) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; if (numMobs != numFetched) localhr = AAFRESULT_TEST_FAILED; for (i = 0; i < numMobs; i++) { if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; } cloneMobIter->Reset(); cloneMobIter->Skip(1); if (cloneMobIter->Next(numMobs, mobArray, &numFetched) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; if ((numMobs-1) != numFetched) localhr = AAFRESULT_TEST_FAILED; for (i = 0; i < numMobs-1; i++) { if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; } cloneMobIter->Release(); cloneMobIter = NULL; } else localhr = AAFRESULT_TEST_FAILED; // Test the Clone method with with enumerator at end. // Indirectly tests the Skip and Reset methods. mobIter->Reset(); mobIter->Skip(numMobs-1); if (mobIter->Clone(&cloneMobIter) == AAFRESULT_SUCCESS) { if (cloneMobIter->NextOne(&aMob) == AAFRESULT_SUCCESS) { aMob->Release(); aMob = NULL; } if (cloneMobIter->NextOne(&aMob) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; cloneMobIter->Release(); cloneMobIter = NULL; } else localhr = AAFRESULT_TEST_FAILED; // Test the Clone method with with enumerator in the middle. // Indirectly tests the Skip and Reset methods. mobIter->Reset(); mobIter->Skip(numMobs-2); if (mobIter->Clone(&cloneMobIter) == AAFRESULT_SUCCESS) { cloneMobIter->Skip(1); if (cloneMobIter->NextOne(&aMob) == AAFRESULT_SUCCESS) { aMob->Release(); aMob = NULL; } else localhr = AAFRESULT_TEST_FAILED; if (cloneMobIter->NextOne(&aMob) != AAFRESULT_NO_MORE_OBJECTS) localhr = AAFRESULT_TEST_FAILED; cloneMobIter->Release(); cloneMobIter = NULL; } else localhr = AAFRESULT_TEST_FAILED; mobIter->Reset(); if (mobIter->Clone(&cloneMobIter) == AAFRESULT_SUCCESS) { if (cloneMobIter->Next(1, NULL, &numFetched) != AAFRESULT_NULL_PARAM) localhr = AAFRESULT_TEST_FAILED; if (cloneMobIter->Next(1, mobArray, &numFetched) != AAFRESULT_SUCCESS) localhr = AAFRESULT_TEST_FAILED; else { for (i = 0; i < numFetched; i++) { if (mobArray[i] != NULL) { mobArray[i]->Release(); mobArray[i] = NULL; } else localhr = AAFRESULT_TEST_FAILED; } } cloneMobIter->Release(); cloneMobIter = NULL; } else localhr = AAFRESULT_TEST_FAILED; if (SUCCEEDED(localhr)) cout<< " Clone() ... Passed" << endl; else { cout<< " Clone() ... Failed!!!" << endl; hr = AAFRESULT_TEST_FAILED; } checkResult(pHeader->CountMobs(kAAFMasterMob, &numMobs)); checkExpression (1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->CountMobs(kAAFFileMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->CountMobs(kAAFCompMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); // Test usageCode search criteria. { // Should find one TopLevel mob, and two Template mobs. // There should be one mob with usage code TopLevel, and it should be // a composition mob. aafSearchCrit_t usageCrit; usageCrit.searchTag = kAAFByUsageCode; usageCrit.tags.usageCode = kAAFUsage_TopLevel; CheckMobsByUsageCode( pHeader, usageCrit, 1, true, IID_IAAFCompositionMob ); // There should be one composition mob with usage code TopLevel. usageCrit.searchTag = kAAFByCompositionMobUsageCode; usageCrit.tags.usageCode = kAAFUsage_TopLevel; CheckMobsByUsageCode( pHeader, usageCrit, 1, true, IID_IAAFCompositionMob ); // There should be two mobs with usage code Template. They are of difference // types, hence, don't check the type. usageCrit.searchTag = kAAFByUsageCode; usageCrit.tags.usageCode = kAAFUsage_Template; CheckMobsByUsageCode( pHeader, usageCrit, 2, false, IID_IUnknown ); // One of the Template mobs should be a SourceMob, the other should be MasterMob. usageCrit.searchTag = kAAFBySourceMobUsageCode; usageCrit.tags.usageCode = kAAFUsage_Template; CheckMobsByUsageCode( pHeader, usageCrit, 1, true, IID_IAAFSourceMob ); usageCrit.searchTag = kAAFByMasterMobUsageCode; usageCrit.tags.usageCode = kAAFUsage_Template; CheckMobsByUsageCode( pHeader, usageCrit, 1, true, IID_IAAFMasterMob ); } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup and return delete [] mobArray; if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }