Exemple #1
0
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;
}