mmfenh/progressivedownload/ProgressiveDownloadSource/src/ProgressiveDownloadSource.cpp
changeset 16 43d09473c595
parent 14 80975da52420
child 22 128eb6a32b84
--- a/mmfenh/progressivedownload/ProgressiveDownloadSource/src/ProgressiveDownloadSource.cpp	Mon May 03 12:59:52 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1810 +0,0 @@
-/*
-* Copyright (c) 2004 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of "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:  Progressive Download Utility
-*
-*/
-
-
-#include <f32file.h>
-#include <e32std.h>
-#include <mmfdatabuffer.h>
-#include <mmfutilities.h>
-#include <mmf/common/mmfcontroller.h>
-#include <mmfpaniccodes.h>
-//#include "mmffile.h"
-
-#include "MmffilePriv.h"
-#include "FileAccess.h"
-
-
-#include "ProgressiveDownloadSource.h"
-#include <implementationproxy.h>
-
-const TUid KUidProgressiveDlSource	= {KProgressiveDownloadSourceUid};
-
-
-void Panic(TMMFFilePanicCode aPanicCode)
-	{
- 	_LIT(KMMFFilePanicCategory, "CProgressiveDownloadSource");
-	User::Panic(KMMFFilePanicCategory, aPanicCode);
-	}
-
-
-/**
- * Constructs a CTransferBufferCopy
- *
- * @return CTransferBufferCopy*
- */
-CTransferBufferCopy* CTransferBufferCopy::NewL(TInt aMaxLength)
-	{
-	CTransferBufferCopy* self = new (ELeave) CTransferBufferCopy(aMaxLength);
-	CleanupStack::PushL(self);
-	self->ConstructL();
-	CleanupStack::Pop(self);
-	return self;
-	}
-
-/**
- * Second phase constructor for CTransferBufferCopy
- *
- * @return void
- */
-void CTransferBufferCopy::ConstructL()
-	{
-	iBuffer = static_cast<TUint8*>(User::AllocL(iMaxLength));
-	iBufferDes.Set(iBuffer,0,iMaxLength);
-	}
-
-/**
-Destructor.
-*/
-CProgressiveDownloadSource::~CProgressiveDownloadSource()
-	{
-	delete iFile;
-
-	iHandle.Close();
-	iFsSession.Close();
-	delete iFileName;
-	delete iFileExt;
-	delete iFilePath;
-	delete iFileDrive;
-	delete iMmfFileEventHandler;
-	delete iUniqueId;
-
-	// Get rid of everything in RArray's & close them.
-	iRequests.ResetAndDestroy();
-	iTransferBufferCopies.ResetAndDestroy();
-	}
-
-/**
-Protected constructor.
-
-The default implementation is empty.
-*/
-CProgressiveDownloadSource::CProgressiveDownloadSource() : CMMFClip(KUidProgressiveDlSource/*KUidMmfFileSource*/, KUidMmfFileSink ), iFileSize(-1)
-	{
-	iSinkNotStopped = EFalse;
-	}
-
-/**
-Constructs an CProgressiveDownloadSource MDataSource.
-
-@return A pointer to the new CProgressiveDownloadSource data source.
-*/
-MDataSource* CProgressiveDownloadSource::NewSourceL()
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::NewSourceL"));
-    #endif
-	CProgressiveDownloadSource* self = new (ELeave) CProgressiveDownloadSource ;
-	return STATIC_CAST( MDataSource*, self ) ;
-	}
-
-/**
-Constructs a CProgressiveDownloadSource MDataSink
-
-@return A pointer to the new CProgressiveDownloadSource data sink.
-*/
-MDataSink* CProgressiveDownloadSource::NewSinkL()
-	{
-	CProgressiveDownloadSource* self = new (ELeave) CProgressiveDownloadSource ;
-	return STATIC_CAST( MDataSink*, self ) ;
-	}
-
-/**
-Perform source construction dependant on the source construction
-initialisation data aInitData.
-
-@param  aInitData
-        The TPckg<TMMFFileParams> descriptor package containing the file name and full path.
-*/
-void CProgressiveDownloadSource::ConstructSourceL(const TDesC8& aInitData )
-	{
-	ConstructL(aInitData, ESourceMode);
-	}
-
-/**
-Performs sink construction dependant on the sink construction
-initialisation data aInitData.
-
-@param  aInitData
-        The TPckg<TMMFFileParams> descriptor package containing the file name and full path.
-*/
-void CProgressiveDownloadSource::ConstructSinkL(const TDesC8& aInitData)
-	{
-	ConstructL(aInitData, ESinkMode);
-	}
-
-/**
-Protected constructor.
-
-Extracts the initialisation data provided by the calling functions: ConstructSourceL() and
-ConstructSourceL(). Creates a file server session and sets up file name. If there is a file name and
-it cannot be found this function leaves. If there is no file name the function leaves. Does not
-attempt to open the file or check whether the file exists.
-
-@param  aInitData
-        Initialisation data packaged in a TMMFFileParams.
-*/
-void CProgressiveDownloadSource::ConstructL(const TDesC8& aInitData,TMMFileMode aFileMode)
-	{
-	User::LeaveIfError(iFsSession.Connect());
-#ifdef __IPC_V2_PRESENT__
-	// on IPCv2 we auto attach
-	User::LeaveIfError(iFsSession.ShareAuto());
-#else
-	// on IPCv1
-	we use explicit - more efficient
-	User::LeaveIfError(iFsSession.Share(RSessionBase::EExplicitAttach));
-#endif
-
-
-	TBool fileInit = EFalse;
-	HBufC* filename = NULL;
-	TBool filenamePushed = EFalse;
-
-
-	TBool drmContent = EFalse;
-	RDesReadStream stream(aInitData);
-	CleanupClosePushL(stream);
-
-	TUid initUid;
-
-	initUid = TUid::Uid(stream.ReadInt32L());
-
-	if (initUid == KMMFileHandleSourceUid)
-		{
-		TPckgBuf<RFile*> fileptr;
-		stream.ReadL(fileptr);
-
-		iHandle.Duplicate(*fileptr());
-
-		TInt length;
-		length = stream.ReadInt32L();
-		if (length>0)
-			{
-			iUniqueId = HBufC::NewL(length);
-			TPtr16 ptr = iUniqueId->Des();
-			stream.ReadL(ptr, length);
-			}
-		iFileHandle = ETrue;
-		filename = HBufC::NewMaxL(KMaxFileName);
-		TPtr ptr = filename->Des();
-		iHandle.Name(ptr);
-		fileInit = ETrue;
-		drmContent = ETrue;
-		}
-
-	else if (initUid == KMMFileSourceUid)
-		{
-		TInt length;
-		length = stream.ReadInt32L();
-		filename = HBufC::NewMaxLC(length);
-		TPtr ptr = filename->Des();
-		stream.ReadL(ptr, length);
-
-		length = stream.ReadInt32L();
-		if (length>0)
-			{
-			iUniqueId = HBufC::NewMaxL(length);
-			ptr.Set(iUniqueId->Des());
-			stream.ReadL(ptr, length);
-			}
-		CleanupStack::Pop(filename);
-
-		fileInit = ETrue;
-		drmContent = ETrue;
-		}
-	else
-		{
-//		TODO If the UID is unknown we should reject, but  currently
-//		code also used for older calls that just supply filename.
-//		User::Leave(KErrNotSupported);
-		}
-
-	CleanupStack::PopAndDestroy(&stream);
-
-	if (!fileInit && aInitData.Length() == sizeof(TMMFFileHandleParams))
-		{
-		TMMFFileHandleParams params;
-		TPckgC<TMMFFileHandleParams> config(params);
-		config.Set(aInitData);
-		params = config();
-
-
-		if (params.iUid == KFileHandleUid)
-			{
-			fileInit = ETrue;
-			User::LeaveIfError(iHandle.Duplicate(*params.iFile));
-			TInt pos = 0;
-			// make sure the duplicate handle is at the start of the file - the usage of the file handle really requires this
-			User::LeaveIfError(iHandle.Seek(ESeekStart, pos));
-			iFileHandle = ETrue;
-			filename = HBufC::NewMaxLC(KMaxFileName);
-			filenamePushed = ETrue;
-			TPtr ptr = filename->Des();
-			User::LeaveIfError(iHandle.Name(ptr));
-			}
-		}
-
-
-	if (!fileInit) // do old case as last resort
-		{
-		TMMFFileParams params;
-		TPckgC<TMMFFileParams> config(params);
-		config.Set(aInitData);
-		params = config();
-
-		filename = params.iPath.AllocL();
-		fileInit = ETrue;
-		}
-
-	if (!filenamePushed)
-		{
-		// from now on it is assumed pushed.
-		CleanupStack::PushL(filename);
-		}
-
-	TParse parser ;
-	User::LeaveIfError(parser.Set(*filename, NULL, NULL));
-	CleanupStack::PopAndDestroy(filename);
-	if ( !( parser.NamePresent() ) && !( parser.ExtPresent() ) )
-		User::Leave( KErrBadName ) ;
-
-	iFullFileName.Copy( parser.FullName() ) ;
-	iFileName = parser.Name().AllocL() ;
-	iFileExt = parser.Ext().AllocL() ;
-	iFilePath = parser.Path().AllocL() ;
-	iFileDrive = parser.Drive().AllocL() ;
-
-
-	// in order to simulate old behaviour we are not passing error out
-	// but will try to create Content again during PrimeL()
-	if (fileInit && drmContent && aFileMode==ESourceMode)
-		{
-		TInt contentError;
-		if (iFileHandle)
-			{
-			TRAP(contentError,
-				iFile = CContentFile::NewL(iHandle, UniqueId());
-				);
-			}
-		else
-			{
-			// Open for read-only access
-			//rj progressive download needs shared access
-			TRAP(contentError,
-				iFile = CContentFile::NewL(iFsSession, iFullFileName, UniqueId(), EFileShareAny);
-			);
-			}
-		iFileOpen = (contentError==KErrNone);
-		}
-
-	(void)(aFileMode=ESourceMode); // prevent from compiler warning
-
-	}
-
-
-/**
-@deprecated
-
-Returns an RFile handle to the current file.
-
-If there is no current file, one is created. If the file exists then it is opened with read access
-if it is read only, write access otherwise. If the file does not exist then it is opened with
-write access.
-
-@leave KErrNotReady
-       The file is not open.
-
-@return A handle to the current file.
-*/
-RFile& CProgressiveDownloadSource::FileL()
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::FileL"));
-    #endif
-	if (!iFile)
-		User::Leave(KErrNotReady);
-	if (iFileHandle)
-		return iHandle;
-	else
-		return iFile->FileL();
-
-	}
-
-/**
-Returns the file name of the current file.
-
-Note: This will give the wrong answer if the file is renamed!
-
-@return The FileName (without extension).
-*/
-const TDesC& CProgressiveDownloadSource::FileName() const
-	{
-	return *iFileName ;
-	}
-
-/**
-Returns the extension of the current file.
-
-Note: This will give the wrong answer if the file is renamed!
-
-@return The File Extension.
-*/
-const TDesC& CProgressiveDownloadSource::Extension() const
-	{
-	return *iFileExt ;
-	}
-
-/**
-Returns the path of the current file.
-
-Note: This will give the wrong answer if the file is renamed!
-
-@return The FilePath (without filename and extension)
-*/
-const TDesC& CProgressiveDownloadSource::FilePath() const
-	{
-	return *iFilePath ;
-	}
-
-/**
-Returns the drive on which the current file is located.
-
-Note: This will give the wrong answer if the file is renamed!
-
-@return The FileDrive (drive letter only, without path, filename and extension).
-*/
-const TDesC& CProgressiveDownloadSource::FileDrive() const
-	{
-	return *iFileDrive ;
-	}
-
-/**
-Returns the full name of the current file.
-
-Note: This will give the wrong answer if the file is renamed!
-
-@return The file name (full filename including drive letter, without path, filename and extension).
-*/
-const TFileName CProgressiveDownloadSource::FullName() const
-	{
-	return iFullFileName;
-	}
-
-
-/**
-Returns the uniqueID associated with this content. If no uniqueID has been provided, a null
-descriptor will be provided
-
-@return The UniqueID
-*/
-const TDesC& CProgressiveDownloadSource::UniqueId() const
-	{
-	if (iUniqueId)
-		return *iUniqueId;
-	else
-		return KNullDesC;
-	}
-
-
-
-/**
-Deletes the file.
-
-Closes the currently open file, then deletes it. If the file source is accessing a file handle,
-the file is truncated to 0 bytes instead.
-
-@return An error code indicating if the function call was successful. KErrNone on success, otherwise
-        another of the system-wide error codes.
-*/
-TInt CProgressiveDownloadSource::Delete()
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::Delete"));
-    #endif
-	if (!iFileHandle)
-		{
-		delete iFile;
-		iFile = NULL;
-		iFileSize=-1;
-		iPosition=0;
-
-		return iFsSession.Delete(iFullFileName);
-		}
-	else
-		{
-		iFileSize=-1;
-		iPosition=0;
-
-		return iFile->SetSize(0);
-		}
-
-	}
-
-/**
-Sets the file size.
-
-@param  aSize
-        The size of the file.
-
-@return An error code indicating if the function call was successful. KErrNone on success, otherwise
-        another of the system-wide error codes.
-*/
-TInt CProgressiveDownloadSource::SetSize(TInt aSize)
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("[%x]CProgressiveDownloadSource::SetSize to %d"),this,aSize);
-    #endif
-
-    iFix = aSize;
-
-	if ( !iFile )
-		return KErrNotReady;
-
-	TInt err =  iFile->SetSize(aSize);
-	if(err == KErrNone)
-		iFileSize = aSize;
-	else
-		iFileSize = -1;
-
-	return err;
-	}
-
-/**
-Obtains a CTransferBufferCopy from iTransferBufferCopies that is
-at least as big as that required.
-
-There is no need to put the pointer returned by this method onto the CleanupStack
-as it will have already been placed into iTransferBufferCopies.
-
-@param  aMaxLength
-        The size required.
-
-@return A pointer to a valid CTransferBufferCopy.
-*/
-CTransferBufferCopy* CProgressiveDownloadSource::ObtainCopyOfTransferBufferL(TInt aMaxLength)
-	{
-	//find a free transfer buffer copy of the right size
-	TInt firstFree = -1;
-	CTransferBufferCopy* transBufCopyToUse = NULL;
-
-	for(TInt cnt=0; cnt < iTransferBufferCopies.Count(); cnt++)
-		{
-		if(!iTransferBufferCopies[cnt]->InUse())
-			{
-			//record the first free entry, we may remove this
-			//if entries in iTransferBufferCopies > KAcceptableTransferBufferCopiesSize
-			if(firstFree == -1)
-				firstFree = cnt;
-
-			if(iTransferBufferCopies[cnt]->MaxLength() >= aMaxLength)
-				{
-				transBufCopyToUse = iTransferBufferCopies[cnt];
-
-				//Set the MaxLength. This will ensure that the copy acts the same as
-				//the original Transfer buffer, eg. file server will throw KErrOverflow
-				transBufCopyToUse->ReUse(aMaxLength);
-				break;
-				}
-			}
-		}
-
-	//If we failed to find a suitable entry, we need to create a new one
-	if(!transBufCopyToUse)
-		{
-		//Firstly, should we re-cycle an existing entry?
-		//There must be entries in the array, a free entry must have been found,
-		//the size of the array must be beyond the water mark where we want to start
-		//cycling free entries.
-		if((iTransferBufferCopies.Count() > 0) &&
-			(firstFree != -1) &&
-			(iTransferBufferCopies.Count() > KAcceptableTransferBufferCopiesSize))
-			{
-			delete iTransferBufferCopies[firstFree];
-			iTransferBufferCopies.Remove(firstFree);
-
-			transBufCopyToUse = CTransferBufferCopy::NewL(aMaxLength);
-			CleanupStack::PushL(transBufCopyToUse);
-			User::LeaveIfError(iTransferBufferCopies.Insert(transBufCopyToUse,firstFree));
-
-			CleanupStack::Pop();
-			}
-		else
-			{
-#ifdef _DEBUG
-			if(iTransferBufferCopies.Count() > KMaximumTransferBufferCopiesSize)
-				{
-				User::Panic(_L("iTransferBufferCopies grew too large in CProgressiveDownloadSource"),KErrTooBig);
-				}
-#endif
-
-			transBufCopyToUse = CTransferBufferCopy::NewL(aMaxLength);
-			CleanupStack::PushL(transBufCopyToUse);
-			User::LeaveIfError(iTransferBufferCopies.Append(transBufCopyToUse));
-
-			CleanupStack::Pop();
-			}
-		}
-
-	return transBufCopyToUse;
-	}
-
-
-
-/**
-Loads aBuffer from iFile.
-
-The file must already be open for reading. File read is asynchronous. CReadRequest is created to
-respond to completion.
-
-@param  aBuffer
-        The buffer to be filled from the file.
-@param  aConsumer
-        The data sink consumer of the buffer.
-*/
-void CProgressiveDownloadSource::FillBufferL( CMMFBuffer* aBuffer, MDataSink* aConsumer, TMediaId /*aMediaId*/ )
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::FillBufferL"));
-    #endif
-	// Requires that iFile is open for read.
-	// Reads data from iFile into aBuffer
-	if ((aConsumer == NULL) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (!iFile || (iMmfFileEventHandler == NULL))
-		User::Leave(KErrNotReady);
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		CTransferBufferCopy* transBufCopy = NULL;
-		CReadRequest* request = NULL;
-
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		TInt requestSize;
-		if(aBuffer->RequestSize())
-			requestSize = aBuffer->RequestSize();
-		else
-			requestSize = aBufferDes.MaxLength();
-
-		//check whether buffer is safe to send to file server
-		//if not, eg for a transfer buffer, then it needs to be copied
-		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-			{
-			//NB: failure in this method will NOT cause transBufCopy to leak as it will be
-			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
-			transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
-			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, transBufCopy, iPosition, Size(),iBytesDownloaded, iMmfFileEventHandler);
-			}
-		else
-			{
-			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, iPosition, Size(),iBytesDownloaded, iMmfFileEventHandler);
-			}
-
-		CleanupStack::PushL( request );
-
-		StoreRequestL(request); // transfers ownership
-		CleanupStack::Pop() ; // request
-
-		iFile->Read(request->BufferDes(), requestSize, request->iStatus);
-		iPosition += requestSize;
-
-		if (iPosition >= iFileSize)
-			{
-			aBuffer->SetLastBuffer(ETrue);
-			}
-
-		request->SetActive();
-		}
-	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		User::Leave( KErrNotSupported ) ;
-	}
-
-/**
-Empties aBuffer into iFile. The file must be already open for writing.
-
-@param  aBuffer
-        The buffer to be written to the file.
-@param  aSupplier
-        The data source supplier of the buffer.
-*/
-void CProgressiveDownloadSource::EmptyBufferL( CMMFBuffer* aBuffer, MDataSource* aSupplier, TMediaId /*aMediaId*/ )
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::EmptyBufferL"));
-    #endif
-	// Requires that iFile is open for write.
-	// Writes data from iFile into aBuffer
-	if ((aSupplier == NULL) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (!iFile || (iMmfFileEventHandler == NULL))
-		User::Leave(KErrNotReady);
-
-	CTransferBufferCopy* transBufCopy = NULL;
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		CWriteRequest* request = NULL;
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		//check whether buffer is safe to send to file server
-		//if not, eg for a transfer buffer, then it needs to be copied
-		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-			{
-			//Obtain a normal buffer to send to the file server
-			//NB: failure in this method will NOT cause transBufCopy to leak as it will be
-			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
-			transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
-
-			//Copy the data into the buffer we will send to the file server
-			transBufCopy->Des().Copy(aBufferDes);
-
-			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, transBufCopy, iMmfFileEventHandler);
-			}
-		else
-			{
-			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, iMmfFileEventHandler);
-			}
-
-		CleanupStack::PushL( request );
-
-		StoreRequestL(request);  // transfers ownership
-		CleanupStack::Pop(); // request
-
-		iFile->Write(request->BufferDes(), request->BufferDes().Length(), request->iStatus);
-		request->SetActive();
-		}
-	else  // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		User::Leave( KErrNotSupported ) ;
-		}
-	}
-
-/**
-Loads aLength number of bytes into aBuffer from specified point in iFile.
-
-@param  aLength
-        The number of bytes to be read into buffer.
-@param  aBuffer
-        The buffer to be filled from the file.
-@param  aPosition
-        The offset into the file at which to start reading.
-@param  aConsumer
-        The data sink consumer of the buffer.
-*/
-void CProgressiveDownloadSource::ReadBufferL(TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer)
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::ReadBufferL Async"));
-    #endif
-	// Requires that iFile is open for read.
-	// Reads data from iFile into aBuffer
-	if ((aLength < 0) || (aPosition<0) || (aConsumer == NULL) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (!iFile || (iMmfFileEventHandler == NULL))
-		User::Leave(KErrNotReady);
-
-	CTransferBufferCopy* transBufCopy = NULL;
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		CReadRequest* request = NULL;
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		//check whether buffer is safe to send to file server
-		//if not, eg for a transfer buffer, then it needs to be copied
-		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-			{
-			//Obtain a normal buffer to send to the file server
-			//NB: failure in this method will NOT cause transBufCopy to leak as it will be
-			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
-			transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
-
-			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, transBufCopy, aPosition, Size(), iBytesDownloaded,iMmfFileEventHandler);
-			}
-		else
-			{
-			request = new(ELeave) CReadRequest(STATIC_CAST(TAny*, aConsumer), aBuffer, aPosition, Size(), iBytesDownloaded,iMmfFileEventHandler);
-			}
-
-		CleanupStack::PushL( request );
-
-		StoreRequestL(request) ;  //transfers ownership
-		CleanupStack::Pop() ; //request
-
-
-
-		TInt err = iFile->Seek(ESeekStart, aPosition);
-		if (err==KErrNone)
-			iFile->Read(request->BufferDes(), aLength, request->iStatus);
-		else
-			{
-			TRequestStatus* status = &request->iStatus;
-			User::RequestComplete(status, err);
-			}
-
-		//rj wait until runl is completed
-	//	iPosition = aPosition + aLength;
-       iPosition = aPosition;
-
-	// rj 	if (iPosition >= iFileSize)
-	//		{
-	//		aBuffer->SetLastBuffer(ETrue);
-	//		}
-
-		request->SetActive();
-		}
-	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		User::Leave( KErrNotSupported ) ;
-	}
-
-
-/**
-Loads aBuffer from specified point in iFile.
-
-The file must already be open for reading.
-
-@param  aBuffer
-        The buffer to be filled from the file.
-@param  aPosition
-        The offset into file at which to start reading.
-@param  aConsumer
-        The data sink consumer of the buffer.
-*/
-void CProgressiveDownloadSource::ReadBufferL(CMMFBuffer* aBuffer, TInt aPosition, MDataSink* aConsumer)
-	{
-    #if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::ReadBufferL Async"));
-    #endif
-
-	// Requires that iFile is open for read.
-	// Reads data from iFile into aBuffer
-	if ((aPosition<0) || (aConsumer == NULL) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		TInt requestSize;
-		if(aBuffer->RequestSize())
-			requestSize = aBuffer->RequestSize();
-		else
-			requestSize = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data().MaxLength();
-
-		ReadBufferL(requestSize, aBuffer, aPosition, aConsumer);
-		}
-	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		User::Leave(KErrNotSupported);
-	}
-
-
-/**
-Loads aBuffer from specified point in iFile.  Note that this is a synchronous read.
-
-@param  aBuffer
-        The buffer to be filled from the file.
-@param  aPosition
-        The offset into file at which to start reading.
-*/
-void CProgressiveDownloadSource::ReadBufferL( CMMFBuffer* aBuffer, TInt aPosition)
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::ReadBufferL Sync"));
-    #endif
-	// Requires that iFile is open for read.
-	// Reads data from iFile into aBuffer
-	if ((aPosition<0) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (!iFile)
-		User::Leave(KErrNotReady);
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		TInt requestSize;
-		if(aBuffer->RequestSize())
-			requestSize = aBuffer->RequestSize();
-		else
-			requestSize = aBufferDes.MaxLength();
-
-		//check whether buffer is safe to send to file server
-		//if not, eg for a transfer buffer, then it needs to be copied
-		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-			{
-			//NB: failure in this method will NOT cause transBufCopy to leak as it will be
-			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
-			CTransferBufferCopy* transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
-
-			User::LeaveIfError(iFile->Seek(ESeekStart, aPosition));
-			User::LeaveIfError(iFile->Read(transBufCopy->Des(), requestSize));
-			aBufferDes.Copy(transBufCopy->Des().Left(aBufferDes.MaxLength()));
-			}
-		else
-			{
-			User::LeaveIfError(iFile->Seek(ESeekStart, aPosition));
-			User::LeaveIfError(iFile->Read(aBufferDes, requestSize));
-			}
-
-		iPosition = aPosition + aBufferDes.Length();
-
-		//check if the buffer is the last buffer and if so set the last buffer flag on the CMMFDataBuffer
-		//NB: setting last buffer is the done by the formatter, but this is a hang over to account for
-		//existing formatters that may fail if this is removed.
-		if (aBufferDes.Length() < requestSize)
-			aBuffer->SetLastBuffer(ETrue);
-		}
-	else  // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		User::Leave(KErrNotSupported);
-	}
-
-/**
-Empties aLength bytes from aBuffer into iFile at specified location.
-
-@param  aLength
-        The number of bytes to be emptied from buffer.
-@param  aBuffer
-        The data buffer containing bytes to be written.
-@param  aPosition
-        The offset into file at which to start writing.
-@param  aSupplier
-        The data source to be notified when the write has been completed.
-
-@leave  KErrNotReady
-        SinkPrimeL() and SinkThreadLogon() have not been called.
-@leave  KErrArgument
-        aLength<0 or aPosition<0 or aSupplier is NULL.
-@leave  KErrNotSupported
-        aBuffer is not a supported CMMFDataBuffer
-*/
-void CProgressiveDownloadSource::WriteBufferL(TInt aLength, CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier)
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::WriteBufferL Async"));
-    #endif
-
-	if ((aLength<0) || (aPosition<0) || (aSupplier == NULL) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (!iFile || (iMmfFileEventHandler == NULL))
-		User::Leave(KErrNotReady);
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		CWriteRequest* request = NULL;
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		//check whether buffer is safe to send to file server
-		//if not, eg for a transfer buffer, then it needs to be copied
-		if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-			{
-			//NB: failure in this method will NOT cause transBufCopy to leak as it will be
-			//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
-			CTransferBufferCopy* transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
-
-			transBufCopy->Des().Copy(aBufferDes);
-
-			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, transBufCopy, iMmfFileEventHandler);
-			}
-		else
-			{
-			request = new(ELeave) CWriteRequest(STATIC_CAST(TAny*, aSupplier), aBuffer, iMmfFileEventHandler);
-			}
-
-		CleanupStack::PushL( request );
-
-		StoreRequestL(request);  // transfers ownership
-		CleanupStack::Pop(); // request
-
-		iFile->Seek(ESeekStart, aPosition);
-		iFile->Write(request->BufferDes(), aLength, request->iStatus);
-		//iFileSize = -1; //reset cached size
-
-		request->SetActive();
-		}
-	else // if (!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-		{
-		//write bitmap to file
-		User::Leave(KErrNotSupported);
-		}
-	}
-
-/**
-Empties aBuffer into iFile at the specified location.
-
-@param  aBuffer
-        The data buffer containing bytes to be written.
-@param  aPosition
-        The offset into file at which to start writing.
-@param  aSupplier
-        The data source to be notified when the write has been completed.
-
-@leave  KErrNotReady
-        SinkPrimeL() and SinkThreadLogon() have not been called.
-@leave  KErrArgument
-        aSupplier is NULL.
-@leave  KErrNotSupported
-        The aBuffer is not of type KMMFDataBuffer.
-*/
-void CProgressiveDownloadSource::WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition, MDataSource* aSupplier)
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::WriteBufferL Async"));
-    #endif
-	// Requires that iFile is open for write.
-	// Writes data from iFile into aBuffer
-	if ((aPosition<0) || (aSupplier == NULL) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		TUint requestSize = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data().Length();
-
-		WriteBufferL(requestSize, aBuffer, aPosition, aSupplier);
-		}
-	else  // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		//write bitmap to file
-		User::Leave( KErrNotSupported ) ;
-		}
-	}
-
-/**
-Empties aBuffer into iFile at specified location.  Note that this is a synchronous write.
-
-@param  aBuffer
-        The data buffer containing bytes to be written.
-@param  aPosition
-        The offset into file at which to start writing.
-
-@return The error code from RFile.
-*/
-void CProgressiveDownloadSource::WriteBufferL( CMMFBuffer* aBuffer, TInt aPosition )
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::WriteBufferL Sync"));
-    #endif
-	if ((aPosition<0) || (aBuffer == NULL))
-		User::Leave(KErrArgument);
-
-	if (!iFile)
-		User::Leave(KErrNotReady);
-
-	TInt err(KErrNone) ;
-
-	//check whether buffer is safe to send to file server
-	//if not, eg for a transfer buffer, then it needs to be copied
-	if ((!CMMFBuffer::IsFileServerSafe(aBuffer->Type()))
-		&& (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type())))
-		{
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		//NB: failure in this method will NOT cause transBufCopy to leak as it will be
-		//inserted into iTransferBufferCopies by ObtainCopyOfTransferBufferL.
-		CTransferBufferCopy* transBufCopy = ObtainCopyOfTransferBufferL(aBufferDes.MaxLength());
-
-		transBufCopy->Des().Copy(aBufferDes);
-		err = iFile->Seek(ESeekStart, aPosition);
-		if (err==KErrNone)
-			err = iFile->Write(transBufCopy->Des(),transBufCopy->Des().Length());
-		//iFileSize = -1; //reset cached size
-		}
-	else if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		TDes8& aBufferDes = STATIC_CAST( CMMFDataBuffer*, aBuffer )->Data();
-
-		err = iFile->Seek(ESeekStart, aPosition);
-		if (err==KErrNone)
-			err = iFile->Write(aBufferDes, aBufferDes.Length());
-		//iFileSize = -1; //reset cached size
-		}
-	else // if (CMMFBuffer::IsSupportedDataBuffer(aBuffer->Type()))
-		{
-		User::Leave(KErrNotSupported);
-		}
-
-	User::LeaveIfError(err);
-	}
-
-/**
-Gets the number of free bytes in the device's file system.
-
-@return The number of free bytes.
-*/
-TInt64 CProgressiveDownloadSource::BytesFree()
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::BytesFree"));
-    #endif
-
-	TVolumeInfo volInfo;
-	if (iFsSession.Volume(volInfo) == KErrNone)
-		return volInfo.iFree;
-	return TInt64(0);
-	}
-
-/**
-Returns the size of the file in bytes.
-
-Note: This is not the maximum length.
-
-@return The size of the file in bytes.
-*/
-TInt CProgressiveDownloadSource::Size()
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::size iFileSize %d"),iFileSize);
-	  RDebug::Print(_L("CProgressiveDownloadSource::size iFixSize %d"),iFix);
-    #endif
-
-  	TInt size = 0;
-	TInt err = KErrNone;
-	TBool fileOpened = EFalse;
-
-
-	 if(iFix != 0)   //rj
-	 	{
-	 	iFileSize = iFix;
-	 	return iFix;
-	 	}
-
-
-	if(iFileSize != -1)
-		return iFileSize;
-
-	if (!iFile)
-		{
-		// Open the file.
-		TRAP(err, SourcePrimeL());
-		if (iFile)
-			fileOpened = ETrue;
-		}
-	if (err == KErrNone && iFile)
-		err = iFile->Size(size);
-	if (err)
-		{
-		size = 0;
-	//	iFileSize = -1; //reset cached size
-		}
-	else
-		iFileSize = size; //cache the filesize
-
-	if (fileOpened)
-		TRAP_IGNORE(SourceStopL());	// Close the file
-
-	return size;
-
-	}
-
-/**
-Source thread logon.
-
-Shares fsSession between threads
-
-@param  aEventHandler
-        This is an MAsyncEventHandler to handle asynchronous events that occur during the
-        transfer of multimedia data.
-
-@return An error code indicating if the function call was successful. KErrNone on success, otherwise
-        another of the system-wide error codes.
-*/
-TInt CProgressiveDownloadSource::SourceThreadLogon(MAsyncEventHandler& aEventHandler)
-	{
-	iEventHandler = &aEventHandler;
-	if(!iMmfFileEventHandler)
-		{
-		iMmfFileEventHandler = new CMMFFileAsyncEventHandler(this);
-		if(!iMmfFileEventHandler)
-			return KErrNoMemory;
-		}
-#ifdef __IPC_V2_PRESENT__
-	return KErrNone; // nothing to do
-#else
-	return iFsSession.Attach();
-#endif // __HIDE_IPC_V1__
-	}
-
-/**
-Logs off source thread.
-*/
-void CProgressiveDownloadSource::SourceThreadLogoff()
-	{
-	delete iMmfFileEventHandler;
-	iMmfFileEventHandler = NULL;
-	iEventHandler = NULL;
-	}
-
-
-/**
-Sink thread logon.
-
-Shares fsSession between threads.
-
-@param  aEventHandler
-        This is an MAsyncEventHandler to handle asynchronous events that occur during the
-        transfer of multimedia data.
-
-@return An error code indicating if the function call was successful. KErrNone on success, otherwise
-        another of the system-wide error codes.
-*/
-TInt CProgressiveDownloadSource::SinkThreadLogon(MAsyncEventHandler& aEventHandler)
-	{
-	iEventHandler = &aEventHandler;
-	if(!iMmfFileEventHandler)
-		{
-		iMmfFileEventHandler = new CMMFFileAsyncEventHandler(this);
-		if(!iMmfFileEventHandler)
-			return KErrNoMemory;
-		}
-#ifdef __IPC_V2_PRESENT__
-	return KErrNone;
-#else
-	return iFsSession.Attach();
-#endif // __HIDE_IPC_V1__
-	}
-
-/**
-Sink thread log off.
-*/
-void CProgressiveDownloadSource::SinkThreadLogoff()
-	{
-	delete iMmfFileEventHandler;
-	iMmfFileEventHandler = NULL;
-	iEventHandler = NULL;
-	}
-
-/**
-Stores a request in an array.
-
-CReadWriteRequests are stored in the array iRequests.
-This function takes ownership and places the request in the array.
-It also checks the array for completed requests and removes them.
-
-@param  aRequest
-        The request to store.
-*/
-void CProgressiveDownloadSource::StoreRequestL( CReadWriteRequest* aRequest )
-	{
-	// add aRequest to iRequests
-	User::LeaveIfError( iRequests.Append( aRequest ) ) ;
-
-	// Clear out any completed requests
-	for ( TInt ii = 0 ; ii < iRequests.Count() ; ii++ )
-		{
-		if (iRequests[ii]->Completed())
-			{
-			CReadWriteRequest* request = iRequests[ii];
-			delete request;
-
-			iRequests.Remove(ii);
-			ii--;
-			}
-		}
-	}
-
-
-/**
-Cancels outstanding requests.
-
-CReadWriteRequests are stored in the array iRequests.
-This function cancels any outstanding requests and removes them
-from iRequests.
-*/
-void CProgressiveDownloadSource::CancelRequests()
-	{
-	// Clear out any completed requests
-	for ( TInt ii = 0 ; ii < iRequests.Count() ; ii++ )
-		{
-		CReadWriteRequest* request = iRequests[ii];
-		delete request;
-		iRequests.Remove(ii);
-		ii--;
-		}
-	}
-
-
-
-/**
-Returns the data type as a fourCC code of CProgressiveDownloadSource as a data source.
-
-@return The data type fourCC code.
-*/
-TFourCC CProgressiveDownloadSource::SourceDataTypeCode(TMediaId /*aMediaId*/)
-	{
-	return  iSourceFourCC ;
-	}
-
-/**
-Returns the data type as a fourCC code of CProgressiveDownloadSource as a data sink.
-
-@return The data type fourCC code
-*/
-TFourCC CProgressiveDownloadSource::SinkDataTypeCode(TMediaId /*aMediaId*/)
-	{
-	return  iSinkFourCC ;
-	}
-
-
-/**
-CProgressiveDownloadSource as a source is always passive so this function is not supported.
-
-@param  aBuffer
-        The emptied buffer.
-*/
-void CProgressiveDownloadSource::BufferEmptiedL(CMMFBuffer* /* aBuffer */)
-	{
-	Panic(EMMFFilePanicBufferEmptiedLNotSupported);
-	}
-
-/**
-Tests whether a source buffer can be created.
-
-@return	A boolean indicating if if CProgressiveDownloadSource can create its own buffer. EFalse if CProgressiveDownloadSource cannot
-        create it's own buffer.
-*/
-TBool CProgressiveDownloadSource::CanCreateSourceBuffer()
-	{
-	return EFalse;
-	}
-
-/**
-Creates a source buffer.
-
-@param  aMediaId
-        The Media ID.
-@param  aReference
-        A boolean indicating if MDataSource owns the buffer. ETrue if it does, EFalse if the caller
-        owns the buffer.
-
-@return	NULL as a CProgressiveDownloadSource cannot create it's own buffer
-*/
-CMMFBuffer* CProgressiveDownloadSource::CreateSourceBufferL( TMediaId /*aMediaId*/ , TBool& /*aReference*/)
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::CreateSourceBufferL"));
-    #endif
-	User::Leave(KErrNotSupported);
-	return NULL ;
-	}
-
-/**
-CProgressiveDownloadSource as a sink is always passive so this function is not supported.
-
-@param  aBuffer
-        The buffer.
-*/
-void CProgressiveDownloadSource::BufferFilledL(CMMFBuffer* /* aBuffer */)
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::BufferFilledL"));
-    #endif
-	Panic(EMMFFilePanicBufferFilledLNotSupported);
-	}
-
-/**
-Tests whether a sink buffer can be created.
-
-@return	A boolean indicating if the sink buffer can be created. EFalse if CProgressiveDownloadSource cannot create
-        it's own buffer
-*/
-TBool CProgressiveDownloadSource::CanCreateSinkBuffer()
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::CanCreateSinkBuffer"));
-    #endif
-	return EFalse ;
-	}
-
-/**
-Creates a sink buffer.
-
-@param  aMediaId
-        The Media ID.
-@param  aReference
-        A boolean indicating if MDataSource owns the buffer. ETrue if MDataSource owns the buffer,
-        EFalse if the caller owns the buffer.
-
-@return	NULL as a CProgressiveDownloadSource cannot create it's own buffer
-*/
-CMMFBuffer* CProgressiveDownloadSource::CreateSinkBufferL(TMediaId /*aMediaId*/ , TBool& /*aReference*/)
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::CreateSinkBufferL"));
-    #endif
-	User::Leave(KErrNotSupported);
-	return NULL ;
-	}
-
-
-/**
-Primes the source.
-
-When used as a source, the file prime opens the file as read only.
-*/
-void CProgressiveDownloadSource::SourcePrimeL()
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::SourcePrimeL"));
-    #endif
-
-	// don't reopen file if already open
-	if (!iFile)
-		{
-
-		if (iFileHandle)
-			{
-			iFile = CContentFile::NewL(iHandle, UniqueId());
-			}
-		else
-			{
-			// rj Open for progressive download need to have shared access
-			iFile = CContentFile::NewL(iFsSession, iFullFileName, UniqueId(), EFileShareAny);
-
-			}
-
-		}
-	iFileOpen = ETrue;
-	}
-
-/**
-Primes the sink.
-
-When used as a sink, the file prime opens the file for read/write access.
-*/
-void CProgressiveDownloadSource::SinkPrimeL()
-	{
-	// don't reopen file if already open
-	if (!iFile)
-		{
-
-		if (iFileHandle)
-			iFile = CF32File::NewL(iHandle);
-		else
-			iFile = CF32File::NewL(iFsSession, iFullFileName, EFileRead | EFileWrite);
-
-		iSinkNotStopped = ETrue;
-		}
-	iFileOpen = ETrue;
-	}
-
-/**
-Stops the file source. When stopping close the file.
-*/
-void CProgressiveDownloadSource::SourceStopL()
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::SourceStopL"));
-    #endif
-	CancelRequests();
-
-    if(iFile == NULL) //rj
-       return;
-
-	iFileOpen = EFalse;
-	TInt pos = 0;
-	if (!iFileHandle && !iFile->IsProtected())
-		{
-		delete iFile;
-		iFile = NULL;
-	//	iFileSize = -1;
-		}
-	else
-		{
-		User::LeaveIfError(iFile->Seek(ESeekStart, pos));
-
-		}
-
-	iPosition=pos;
-	}
-
-/**
-Stops the file sink.
-
-When stopping close the file.
-*/
-void CProgressiveDownloadSource::SinkStopL()
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::SinkStopL"));
-    #endif
-
-	CancelRequests();
-	iFileOpen = EFalse;
-	if (!iFileHandle)
-		{
-		iSinkNotStopped = EFalse;
-		delete iFile;
-		iFile = NULL;
-		}
-	else
-		{
-		TInt pos = 0;
-		User::LeaveIfError(iFile->Seek(ESeekStart, pos));
-		}
-	//iFileSize = -1;
-	iPosition=0;
-	}
-
-/**
-Returns a boolean indicating if the sink has been stopped.
-
-@return A boolean indicating if the sink has stopped.
- */
-TBool CProgressiveDownloadSource::SinkStopped()
-	{
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::SinkStopped"));
-    #endif
-	if(iSinkNotStopped == EFalse)
-		return ETrue;
-	else
-		return EFalse;
-	}
-
-/**
-Evaluates a given intent against the rights associated with the file.
-
-The rights are not updated by this function call.
-
-@param  aIntent
-        The intent to evaluate.
-
-@return An error code indicating if the function call was successful. KErrNone on success, otherwise
-        another of the system-wide error codes.
-*/
-TInt CProgressiveDownloadSource::EvaluateIntent(ContentAccess::TIntent aIntent) const
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::EvaluateIntent"));
-    #endif
-	if (iFile==NULL)
-		{
-		return KErrNotReady;
-		}
-
-	return iFile->EvaluateIntent(aIntent);
-	}
-
-/**
-Evaluates and executes a given intent against the rights associated with the file.
-
-The rights object is updated after calling this function.
-
-@param  aIntent
-        The intent to evaluate.
-
-@return An error code indicating if the function call was successful. KErrNone on success, otherwise
-        another of the system-wide error codes.
-*/
-TInt CProgressiveDownloadSource::ExecuteIntent(ContentAccess::TIntent aIntent)
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::ExecuteIntent"));
-    #endif
-	if (!iFile)
-		return KErrNotReady;
-
-	return iFile->ExecuteIntent(aIntent);
-	}
-
-/**
-Returns whether the file is protected.
-
-@return A boolean indicating if the file is protected. ETrue if the file is protected.
-*/
-TBool CProgressiveDownloadSource::IsProtectedL() const
-	{
-
-	#if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::IsProtectedL"));
-    #endif
-	if (!iFile)
-		User::Leave(KErrNotReady);
-
-	return iFile->IsProtected();
-	}
-
-
-
-
-
-TInt CProgressiveDownloadSource::SetAgentProperty(ContentAccess::TAgentProperty aProperty, TInt aValue)
-	{
-	if (iFile==NULL)
-		{
-		return KErrNotReady;
-		}
-
-	return iFile->SetAgentProperty(aProperty, aValue);
-	}
-
-void CProgressiveDownloadSource::SourceCustomCommand(TMMFMessage& aMessage)
-	{
-    #if _DEBUG
-	  RDebug::Print(_L("CProgressiveDownloadSource::SourceCustomCommand"));
-    #endif
-
-    TInt err= KErrNone;
-	switch(aMessage.Function())
-		  {
-		  case EGETFILEPOSITION:
-			  {
-			  //get iPosition;
-			   #if _DEBUG
-	           RDebug::Print(_L("CProgressiveDownloadSource::SrcCustomCommand file position %d"),iPosition);
-               #endif
-              TPckgBuf<TInt> positionPckg(iPosition);
-			  err = aMessage.WriteDataToClient(positionPckg);
-
-			  break;
-			  }
-          case ESETFILESIZE:
-			  {
-			  //set file size;
-			  TPckgBuf<TInt> fileSizePckg;
-			  err = aMessage.ReadData1FromClient(fileSizePckg);
-			  if((err==KErrNone) && (fileSizePckg()>0))
-				  SetSize(fileSizePckg());
-
-			  break;
-
-			  }
-		 case ESETBYTESDOWNLOADED:
-		 	  {
-		      TPckgBuf<TInt> bytesDownloadedPckg;
-		      err = aMessage.ReadData1FromClient(bytesDownloadedPckg);
-
-		      if((err==KErrNone) &&(bytesDownloadedPckg()>0))
-		          iBytesDownloaded = bytesDownloadedPckg();
-		      break;
-		 	  }
-		  default:
-			  err = KErrNotSupported;
-			  break;
-		  }
-
-	aMessage.Complete(err);
-
-	}
-
-/*
- *	Returns ETrue if the request can safely be deleted.
- */
-TBool CReadWriteRequest::Completed()
-	{
-	return iCompleted ;
-	}
-
-/*
- *	Returns the data member of CMMFDataBuffer or CMMFTransferBuffer (as TPtr8)
- *
- */
-TDes8& CReadWriteRequest::BufferDes()
-	{
-	if(iTransferBufferCopy)
-		return iTransferBufferCopy->Des();
-	else
-		{
-		//reset iBufferDes in case iBuffer has changed...
-		iBufferDes = &(STATIC_CAST(CMMFDataBuffer*, iBuffer)->Data());
-		return *iBufferDes;
-		}
-	}
-
-const TDesC8& CReadWriteRequest::BufferDesC()
-	{
-	if(iTransferBufferCopy)
-		return iTransferBufferCopy->Des();
-	else
-		return BufferDes();
-	}
-
-
-/*
- *	Destructor.
- */
-CReadWriteRequest::~CReadWriteRequest()
-	{
-	Cancel();
-	if(iTransferBufferCopy)
-		iTransferBufferCopy->SetInUse(EFalse);
-	}
-
-/*
- *	Allows owning class access to SetActive()
- */
-void CReadWriteRequest::SetActive()
-	{
-	CActive::SetActive() ;
-	}
-
-/*
- *  For the moment at least...    Canceled requests may be deleted
- */
-void CReadWriteRequest::DoCancel()
-	{
-	iCompleted = ETrue ;
-	}
-
-/*
- *	Called when errors in RunL force Leave.  For the moment just mark the request deletable
- */
-TInt CReadWriteRequest::RunError( TInt aError )
-	{
-	//RunL can leave.
-	iCompleted = ETrue ;
-	iError = aError; //keep this error internally for now
-	return KErrNone ;
-	}
-
-/*
- *	On completion of read request call back to the MDataSink
- */
-void CReadRequest::RunL()
-	{
-
-	#if _DEBUG
-	   RDebug::Print(_L("CReadRequest::RunL file byte position %d"),iPosition);
-	   RDebug::Print(_L("CReadRequest::RunL buffer length %d"),BufferDes().Length());
-	#endif
-
-	if (iStatus != KErrNone)
-		{
-		TMMFEvent event(KMMFErrorCategoryControllerGeneralError, iStatus.Int());
-		iEventHandler->SendEventToClient(event);
-		}
-	else
-		{
-		//Copy the data from the normal buffer into the Transfer buffer
-		if(iTransferBufferCopy)
-			{
-			//must specify the size here as the dest may be smaller than the source.
-			TDes8& destDesc = STATIC_CAST(CMMFDataBuffer*, iBuffer)->Data();
-			destDesc.Copy(iTransferBufferCopy->Des().Left(destDesc.MaxLength()));
-
-			iTransferBufferCopy->SetInUse(EFalse);
-			}
-
-	   #if _DEBUG
-	      RDebug::Print(_L("CReadRequest::RunL bytes downloaded %d"),iBytesDownloaded);
-	   #endif
-	   if(iBytesDownloaded > 0 &&
-	      iBytesDownloaded <= iPosition + BufferDes().Length() &&
-	      iBytesDownloaded < iFileSize)
-		 {
-	   	 #if _DEBUG
-	       RDebug::Print(_L("CReadRequest::RunL - OUT OF DATA"));
-	   	 #endif
-
-	     STATIC_CAST(CMMFDataBuffer*, iBuffer)->Data().SetLength(0);
-
-		 }
-	    else
-	     {
-	     iPosition = iPosition + BufferDes().Length();
-	     }
-
-		//has all the files data been read
-		if(iPosition >= iFileSize)
-			{
-        #if _DEBUG
-           RDebug::Print(_L("CReadRequest::RunL filesize %d"),iFileSize);
-		   RDebug::Print(_L("CReadRequest::RunL file position %d"),iPosition);
-		   RDebug::Print(_L("CReadRequest::RunL setlastbuffer "));
-        #endif
-
-			iBuffer->SetLastBuffer(ETrue);
-			}
-
-		REINTERPRET_CAST(MDataSink*, iSinkOrSource)->BufferFilledL(iBuffer) ; // callback to MDataSource/Sink
-		}
-
-	iCompleted = ETrue ;
-	}
-
-/*
- *  On completion of write request call back to the MDataSource
- */
-void CWriteRequest::RunL()
-	{
-	if(iTransferBufferCopy)
-		iTransferBufferCopy->SetInUse(EFalse);
-
-	if (iStatus != KErrNone)
-		{
-		TMMFEvent event(KMMFErrorCategoryControllerGeneralError, iStatus.Int());
-		iEventHandler->SendEventToClient(event);
-		}
-	else
-		REINTERPRET_CAST(MDataSource*, iSinkOrSource)->BufferEmptiedL(iBuffer) ; // callback to MDataSource/Sink
-
-	iCompleted = ETrue ;
-	}
-
-CProgressiveDownloadSource::CMMFFileAsyncEventHandler::CMMFFileAsyncEventHandler(CProgressiveDownloadSource* aParent)
-	{
-	iParent = aParent;
-	}
-
-CProgressiveDownloadSource::CMMFFileAsyncEventHandler::~CMMFFileAsyncEventHandler()
-	{
-	}
-
-TInt CProgressiveDownloadSource::CMMFFileAsyncEventHandler::SendEventToClient(const TMMFEvent& aEvent)
-	{
-
-#if _DEBUG
-     RDebug::Print(_L("CProgressiveDownloadSource::CMMFFileAsyncEventHandler::SendEventToClient err=%d"),aEvent.iErrorCode);
-#endif
-
-	if(aEvent.iErrorCode == KErrNotReady)//i.e. MMC removed while recording
-		TRAP_IGNORE(iParent->SinkStopL());
-	return iParent->iEventHandler->SendEventToClient(aEvent);
-	}
-
-
-
-// __________________________________________________________________________
-// Exported proxy for instantiation method resolution
-// Define the interface UIDs
-
-const TImplementationProxy ImplementationTable[] =
-	{
-		IMPLEMENTATION_PROXY_ENTRY(KProgressiveDownloadSourceUid,CProgressiveDownloadSource::NewSourceL)
-	};
-
-EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount)
-	{
-	aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy);
-
-	return ImplementationTable;
-	}