contentmgmt/referencedrmagent/contentiterator/embeddedcontentiteratorbase.cpp
changeset 15 da2ae96f639b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/referencedrmagent/contentiterator/embeddedcontentiteratorbase.cpp	Mon Oct 12 10:17:04 2009 +0300
@@ -0,0 +1,155 @@
+/*
+* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#include <f32file.h>
+#include <apmstd.h>
+
+#include "contentIterator.h"
+#include "virtualpath.h"
+#include "content.h"
+#include "EmbeddedcontentIteratorBase.h"
+#include "embeddedobject.h"
+
+using namespace ContentAccess;
+
+
+CEmbeddedContentIteratorBase* CEmbeddedContentIteratorBase ::NewL(CContent& aContent, TBool aRecursive, const TDesC8& aMimeType)
+	{
+	CEmbeddedContentIteratorBase* self = new (ELeave) CEmbeddedContentIteratorBase(aContent, aRecursive, aMimeType);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CEmbeddedContentIteratorBase::ConstructL()
+	{
+	// populate the array with the items at this level of the content file
+	iContent.GetEmbeddedObjectsL(iEmbeddedContentObjects, EContentObject);
+	iContent.GetEmbeddedObjectsL(iEmbeddedContainerObjects, EContainerObject);
+
+	// Find the Next,  (ie. first content object)
+	// This will leave if there is no object
+	User::LeaveIfError(Next());
+	}
+
+CEmbeddedContentIteratorBase::CEmbeddedContentIteratorBase(CContent& aContent, TBool aRecursive, const TDesC8& aMimeType) 
+	: iContent(aContent), iRecursive(aRecursive), iMimeType(aMimeType)
+	{
+	iContentIndex = 0;
+	iContainerIndex = 0;
+	}
+
+CEmbeddedContentIteratorBase::~CEmbeddedContentIteratorBase()
+	{
+	delete iSubIterator;
+
+	// Clear array 
+	iEmbeddedContainerObjects.Close();
+	iEmbeddedContentObjects.Close();
+	}	
+
+CEmbeddedObject& CEmbeddedContentIteratorBase::EmbeddedObject()
+	{
+	// The next pointer is currently on an object inside the subiterator
+	if(iSubIterator)
+		{
+		return iSubIterator->EmbeddedObject();
+		}
+	else
+		{	
+		return *iEmbeddedContentObjects[iContentIndex - 1];
+		}
+	}
+		
+TInt CEmbeddedContentIteratorBase::Next()
+	{
+	// Must figure out if there's a constant for this
+	TBuf8 <KMaxDataTypeLength> mimeType;
+	TInt ret = KErrNotFound;
+
+	// If we are already looking into a container, try finding the next in there
+	if(iSubIterator)
+		{
+		ret = iSubIterator->Next();
+		if(ret == KErrNone)
+			{
+			return ret;
+			}
+		else 
+			{
+			// come back to our level
+			iContent.CloseContainer();
+
+			// Delete sub-iterator
+			delete iSubIterator;
+			iSubIterator = NULL;
+			}
+		}
+	
+
+	// Find content objects inside this container
+	for( ; iContentIndex < iEmbeddedContentObjects.Count(); iContentIndex++)
+		{
+		// if we don't care about mime type, this content object will do
+		if(iMimeType.Length() == 0)
+			{
+			// make sure next time we look at the next item in our array
+			iContentIndex++;
+			return KErrNone;
+			}
+
+		// See if the content object has the right mime type that we are looking for
+		mimeType.Copy(iEmbeddedContentObjects[iContentIndex]->MimeType());
+		if(iMimeType == mimeType)
+			{
+			// make sure next time we look at the next item in our array
+			iContentIndex++;
+			return KErrNone;
+			}
+		// otherwise continue to next iteration, for loop incrementes iContentIndex		
+		}		
+	
+	// Free memory allocated for content objects
+	if(iContentIndex)
+		{
+		iEmbeddedContentObjects.ResetAndDestroy();
+		iContentIndex = 0;
+		}
+
+	// Find content objects within nested containers
+	for( ; iContainerIndex < iEmbeddedContainerObjects.Count(); iContainerIndex++)
+		{
+		// If it's a container look inside 
+		iContent.OpenContainer(iEmbeddedContainerObjects[iContainerIndex]->UniqueId());
+		TRAPD(err, iSubIterator = CEmbeddedContentIteratorBase::NewL(iContent, iRecursive, iMimeType));
+		if(err == KErrNone)
+			{
+			// must have found something inside
+			// make sure next time we search at the next item in our array
+			iContainerIndex++;
+			return KErrNone;
+			}
+		// otherwise continue to next iteration
+		}
+
+	// must be at the end of the array, ie. can't find any more content objects
+	return KErrNotFound;
+	}
+
+