contentmgmt/referencedrmagent/contentiterator/FileContentIteratorbase.cpp
changeset 15 da2ae96f639b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contentmgmt/referencedrmagent/contentiterator/FileContentIteratorbase.cpp	Mon Oct 12 10:17:04 2009 +0300
@@ -0,0 +1,204 @@
+/*
+* 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 "manager.h"
+#include "embeddedobject.h"
+#include "FileContentIteratorBase.h"
+#include "EmbeddedcontentIterator.h"
+
+using namespace ContentAccess;
+
+_LIT(KCAFBackSlashCharacter, "\\");
+
+
+CFileContentIteratorBase* CFileContentIteratorBase::NewL(CManager &aManager, const TDesC& aPath, TBool aRecursive, const TDesC8& aMimeType)
+	{
+	CFileContentIteratorBase* self = new (ELeave) CFileContentIteratorBase(aManager, aPath, aRecursive, aMimeType);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+CFileContentIteratorBase::CFileContentIteratorBase(CManager& aManager, const TDesC& aPath, TBool aRecursive, const TDesC8& aMimeType) :
+		iManager(aManager), iPath(aPath), iRecursive(aRecursive), iMimeType(aMimeType)
+	{
+	iDirIndex = 0;
+	iFileIndex = 0;
+	}
+
+void CFileContentIteratorBase::ConstructL()
+	{
+	// Get our list of files and directories
+	User::LeaveIfError(iManager.GetDir(iPath, ESortByName, KEntryAttNormal, iCurrentFileList, iCurrentDirectoryList));
+
+	if(!iRecursive)
+		{
+		// Won't be needing the list of directories
+		delete iCurrentDirectoryList;
+		iCurrentDirectoryList = NULL;
+		}
+
+	// Find the Next,  (ie. first content object) inside this directory
+	// This will leave if nothing was found
+	User::LeaveIfError(Next());
+	}
+
+CFileContentIteratorBase::~CFileContentIteratorBase()
+	{
+	delete iSubIterator;
+	delete iCurrentDirectoryList;
+	delete iCurrentFileList;
+	delete iNewPath;
+	}
+
+const TDesC& CFileContentIteratorBase::FileName() const
+	{
+	return iSubIterator->FileName();
+	}
+
+const TDesC& CFileContentIteratorBase::UniqueId() const
+	{
+	return iSubIterator->UniqueId();
+	}
+
+const TDesC& CFileContentIteratorBase::Name() const
+	{
+	return iSubIterator->Name();
+	}
+	
+const TDesC8& CFileContentIteratorBase::MimeType() const
+	{
+	return iSubIterator->MimeType();
+	}
+		
+TInt CFileContentIteratorBase::Next()
+	{	
+	_LIT(KSysDirEntry, "sys");
+	
+	TInt ret = KErrNotFound;
+
+	// If we are already looking into some sub container, try finding the next in there
+	if(iSubIterator)
+		{
+		ret = iSubIterator->Next();
+		if(ret == KErrNone)
+			{
+			return ret;
+			}
+		else 
+			{
+			// Delete sub-iterator
+			delete iSubIterator;
+			iSubIterator = NULL;
+			delete iNewPath;
+			iNewPath = NULL;
+			}
+		}
+
+
+	// Search files in our directory first
+	// this allows us to free memory used by iCurrentFileList
+	// before recursing into sub-directories
+	if(iCurrentFileList)
+		{
+		for ( ; iFileIndex < iCurrentFileList->Count(); iFileIndex++)
+			{
+			// Get a reference to the file we are interested in
+			const TEntry &entry = (*iCurrentFileList)[iFileIndex];
+		
+			// create a new path string for the sub directory
+			TRAP(ret, iNewPath = HBufC::NewL(iPath.Length() + entry.iName.Length()));
+			if(ret != KErrNone)
+				{
+				return ret;
+				}
+			iNewPath->Des().Append(iPath);
+			iNewPath->Des().Append(entry.iName);
+		
+			// Look inside the file
+			TRAP(ret, iSubIterator = CEmbeddedContentIterator::NewL(TVirtualPathPtr(*iNewPath, KNullDesC()), iRecursive, iMimeType));
+		
+			if(ret == KErrNone)
+				{	
+				// must have found something in the file
+				// make sure next time we look at the next item in our list
+				iFileIndex++;
+				return KErrNone;
+				}
+			// next iteration
+			delete iNewPath;
+			iNewPath = NULL;
+			}
+		delete iCurrentFileList;
+		iCurrentFileList = NULL;
+		}
+
+
+	if(iRecursive)
+		{
+		// Search sub directories
+		for ( ; iDirIndex < iCurrentDirectoryList->Count(); iDirIndex++)
+			{
+			// Get a reference to the directory we are interested in
+			const TEntry &entry = (*iCurrentDirectoryList)[iDirIndex];
+
+			// make sure it's not the sys directory
+			if(KSysDirEntry().CompareF(entry.iName) == 0 && iPath.Length() == 3)
+				{
+				// go to the next iteration, skip the sys directory
+				continue;
+				}
+
+			// create a new path string for the sub directory
+			TRAP(ret, iNewPath = HBufC::NewL(iPath.Length() + 1 + entry.iName.Length()));
+			if(ret != KErrNone)
+				{
+				return ret;
+				}
+			iNewPath->Des().Append(iPath);
+			iNewPath->Des().Append(entry.iName);
+			iNewPath->Des().Append(KCAFBackSlashCharacter);
+		
+
+			// lets look inside the directory
+			TRAP(ret, iSubIterator = CFileContentIteratorBase::NewL(iManager, *iNewPath, iRecursive, iMimeType));
+
+			if(ret == KErrNone)
+				{	
+				// must have found something in the sub-iterator
+				// make sure next time we look at the next item in our list
+				iDirIndex++;
+				return KErrNone;
+				}
+			// next iteration
+			delete iNewPath;
+			iNewPath = NULL;
+			}
+		}
+	
+	// reached the end of our list of directories and list of files
+	return KErrNotFound;	
+	}