mmlibs/mmfw/src/server/BaseClasses/mmfdatabuffer.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmlibs/mmfw/src/server/BaseClasses/mmfdatabuffer.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,600 @@
+// Copyright (c) 2003-2009 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:
+// source\mmf\server\baseclasses\mmfdatabuffer.cpp
+// 
+//
+
+#include <mmf/server/mmfdatabuffer.h>
+
+
+
+
+/**
+Method to instantiate a CMMFDataBuffer defaults to a CMMFDescriptorBuffer
+to maintain buffer compatiblity with MFAD ie. instantiating a CMMFDataBuffer defaults to creating 
+a CMMFDescriptorBuffer. This NewL creates a CMMFDescriptorBuffer with a default size of 32 bytes.
+
+@return	A pointer to a new CMMFDescriptorBuffer.
+*/
+EXPORT_C CMMFDataBuffer* CMMFDataBuffer::NewL()
+	{
+	return CMMFDescriptorBuffer::NewL();
+	}
+
+/**
+Method to instantiate a CMMFDataBuffer defaults to a CMMFDescriptorBuffer by default
+to maintain buffer compatiblity with MFAD ie. instantiating a CMMFDataBuffer defaults to
+creating a CMMFDescriptorBuffer. This NewL creates a CMMFDescriptorBuffer with a size of 
+aMaxBufferSize bytes.
+
+@param  aMaxBufferSize
+        The size in bytes of the descriptor buffer to be created.
+
+@return A pointer to a new CMMFDescriptorBuffer.
+*/
+EXPORT_C CMMFDataBuffer* CMMFDataBuffer::NewL(TInt aMaxBufferSize)
+	{
+	return CMMFDescriptorBuffer::NewL(aMaxBufferSize);
+	}
+
+
+/**
+Method to instantiate a CMMFDescriptorBuffer.
+
+Defaults to a CMMFDescriptorBuffer automatically. This NewL creates a CMMFDescriptorBuffer with a 
+default size of 32 bytes.
+
+@return A pointer to a new CMMFDescriptorBuffer.
+*/
+EXPORT_C CMMFDescriptorBuffer* CMMFDescriptorBuffer::NewL()
+	{
+	CMMFDescriptorBuffer* self = new(ELeave) CMMFDescriptorBuffer;
+	CleanupStack::PushL(self);
+	self->ConstructL(KMMFDataBufferDefaultBufferSize);
+	CleanupStack::Pop(); // self
+	return self;
+	}
+
+
+/**
+Method to instantiate a CMMFDescriptorBuffer.
+This NewL creates a CMMFDescriptorBuffer with a size of aMaxBufferSize bytes.
+
+@param  aMaxBufferSize
+        The size in bytes of the descriptor buffer to be created.
+
+@return A pointer to a new CMMFDescriptorBuffer.
+*/
+EXPORT_C CMMFDescriptorBuffer* CMMFDescriptorBuffer::NewL(TInt aMaxBufferSize)
+	{
+	CMMFDescriptorBuffer* self = new(ELeave) CMMFDescriptorBuffer;
+	CleanupStack::PushL(self);
+	self->ConstructL(aMaxBufferSize);
+	CleanupStack::Pop(); // self
+	return self;
+	}
+
+/**
+@internalTechnology
+
+Internal.
+
+@param  aMaxBufferSize
+        The size in bytes of the descriptor buffer to be created.
+*/
+void CMMFDescriptorBuffer::ConstructL(TInt aMaxBufferSize)
+	{
+	iData = new(ELeave) TUint8[aMaxBufferSize];
+	iPtr.Set(iData, 0, aMaxBufferSize);
+	}
+
+/**
+Destructor.
+
+Destructor also deletes the buffer contained in the CMMFDescriptorBuffer.
+*/
+EXPORT_C CMMFDescriptorBuffer::~CMMFDescriptorBuffer()
+	{
+	delete[] iData;
+	}
+
+/**
+Reallocates the max size in bytes of a CMMFDescriptorBuffer.
+
+@param  aMaxBufferSize
+        The new size in bytes of the descriptor buffer.
+*/
+EXPORT_C void CMMFDescriptorBuffer::ReAllocBufferL(TInt aMaxBufferSize)
+	{
+	TUint8* tmp = new(ELeave) TUint8[aMaxBufferSize];
+	delete[] iData;
+	iData = tmp;
+	iPtr.Set(iData, 0, aMaxBufferSize);
+	}
+
+/**
+Returns a descriptor to the data contained in the CMMFDescriptorBuffer.
+
+@return A reference to a TPtr containing the CMMFDescriptorBuffer data.
+*/
+TDes8& CMMFDescriptorBuffer::Data()
+	{
+	return iPtr;
+	}
+
+/**
+Returns a descriptor to the data contained in the CMMFDescriptorBuffer.
+
+@return A const reference to a TPtr containing the CMMFDescriptorBuffer data.
+*/
+const TDesC8& CMMFDescriptorBuffer::Data() const
+	{
+	return iPtr;	
+	}
+
+/**
+Returns the actual data size (ie. not the maximum length) of the
+data contained in the CMMFDescriptorBuffer.
+
+@return	The size in bytes of the data contained in the CMMFDescriptorBuffer.
+*/
+TUint CMMFDescriptorBuffer::BufferSize() const
+	{
+	return iPtr.Length();
+	}
+
+/**
+Sets the position.
+
+This method is used by components (eg codecs) which read data from a buffer
+and wish to store a read position marker for further reads.
+Note: The position cannot exceed the size of the actual data not the max length.
+
+@param  aPosition
+        The position.
+*/
+void CMMFDescriptorBuffer::SetPosition (TUint aPosition)
+	{//used for repositioning
+	if (aPosition <= (TUint)iPtr.Length()) 
+		iPosition = aPosition;
+	else 
+		iPosition = (TUint)iPtr.Length();//tried to position beyond end of data
+	}
+
+/**
+Sets the request size.
+
+This function is used in cases where a component (eg a data source) may not be able
+or be desirable to write to the entire max length of the buffer (eg variable bit rate codecs).
+In which case the SetRequestSizeL() can be set which can be read by the RequestSize()
+function in the component so that it knows to only write data upto the request size
+and not fill the buffer up to its max length.
+
+@param  aSize
+        The request size.
+*/
+void CMMFDescriptorBuffer::SetRequestSizeL(TInt aSize)
+	{
+	if (aSize < 0)
+		User::Leave(KErrUnderflow);
+	else if (aSize > iPtr.MaxLength())
+		User::Leave(KErrOverflow);
+	else
+		iRequestSize = aSize;
+	}
+
+
+/**
+Overriden method to set the status and resets the data size to 0 when the buffer becomes available.
+
+@param  aStatus
+        The buffer status. See TBufferStatus for possible options.
+*/
+void CMMFDescriptorBuffer::SetStatus(TBufferStatus aStatus)
+	{
+	CMMFBuffer::SetStatus(aStatus);
+	if ((iStatus == EAvailable)&&iData)
+		{//need to set size to 0
+		iPtr.Zero();
+		}
+	}
+
+
+/**
+This function is not supported under EKA2.
+
+Method to instantiate a CMMFTransferBuffer. This NewL creates a CMMFTransferBuffer.
+
+@param  aTransferWindow
+        This is a valid RTransferWindow that has an RTransferBuffer mapped in.
+@param  aDataLength
+        This parameter sets the length of the actual data present in the transferbuffer.
+        This is because the length of actual data may be less than the length of the mapped in
+        transfer buffer.
+
+@return A pointer to a new CMMFTransferBuffer.
+*/
+
+EXPORT_C CMMFTransferBuffer* CMMFTransferBuffer::NewL(RTransferWindow& aTransferWindow, TUint aDataLength)
+	{
+//this method is not supported under EKA2
+	User::Panic(_L("Not supported!"), KErrNotSupported);
+	aTransferWindow = aTransferWindow;	//suppressed unused argument warnings
+	aDataLength =  aDataLength;			//suppressed unused argument warnings
+	return NULL;			//can't construct anything useful
+	}
+
+/**
+@internalTechnology
+
+This method is not supported under EKA2.
+
+Internal ConstructL.
+
+Note this method checks if a transfer buffer has been mapped in and
+will leave with KErrNotReady if the RTransferWindow does not have a mapped
+in RTransferBuffer.
+
+@param  aTransferWindow
+        This is a reference to a valid RTransferWindow that has an RTransferBuffer mapped in.
+@param  aDataLength
+        The length of the data.
+*/
+void CMMFTransferBuffer::ConstructL(RTransferWindow& aTransferWindow, TUint aDataLength)
+	{
+//this method is not supported under EKA2
+	aTransferWindow = aTransferWindow;	//suppressed unused argument warnings
+	aDataLength =  aDataLength;			//suppressed unused argument warnings
+	}
+
+
+/**
+CMMFTransferBuffer destructor
+
+Destructor maps out RTransferBuffer and closes RTransferWindow.
+*/
+EXPORT_C CMMFTransferBuffer::~CMMFTransferBuffer()
+	{
+	}
+
+/**
+Returns a descriptor to the data contained in the CMMFTransferBuffer.
+
+@return	A reference to a TPtr containing the CMMFTransferBuffer data.
+*/
+TDes8& CMMFTransferBuffer::Data()
+	{
+	return iPtr;
+	}
+
+/**
+Returns a descriptor to the data contained in the CMMFTransferBuffer.
+
+@return	A const reference to a TPtr containing the CMMFTransferBuffer data.
+*/
+const TDesC8& CMMFTransferBuffer::Data() const
+	{
+	return iPtr;
+	}
+
+/**
+Returns the actual data size (ie. not the max length) of the
+data contained in the CMMFTransferBuffer.
+
+@return	The size in bytes of the data contained in the CMMFTransferBuffer.
+*/
+TUint CMMFTransferBuffer::BufferSize() const
+	{
+	return iPtr.Length();
+	}
+
+
+/**
+Sets the position.
+
+This method is used by components (eg codecs) which read data from a buffer
+and wish to store a read position marker for further reads.
+
+Note: The position cannot exceed the size of the actual data not the max length.
+
+@param  aPosition
+        The position.
+*/
+void CMMFTransferBuffer::SetPosition (TUint aPosition)
+	{//used for repositioning
+	aPosition = aPosition; //suppress compiler warning
+	}
+
+/**
+Sets the request size.
+
+This function is used in cases where a component (eg. a data source) may not be able
+or be desirable to write to the entire max length of the buffer (eg. variable bit rate codecs).
+In this case, the SetRequestSizeL can be set which can be read by the RequestSize()
+function in the component so that it knows to only write data upto the request size
+and not fill the buffer up to its max length.
+
+@param  aSize
+        The request size.
+*/
+void CMMFTransferBuffer::SetRequestSizeL(TInt aSize)
+	{
+	aSize = aSize; //suppress compiler warning
+	}
+
+
+/**
+This function is not supported under EKA2.
+
+Returns a reference to the transfer window currently used
+by the CMMFtransferBuffer.
+
+@return	A reference to the current RTransferWindow.
+*/
+EXPORT_C RTransferWindow& CMMFTransferBuffer::TransferWindow()
+	{
+	return iTransferWindow;
+	}
+
+
+/**
+This method is not supported under EKA2.
+
+Modifies the CMMFTransferBuffer by updating the RTransferWindow.
+
+This method is used if the same CMMFTransferBuffer is used throughout
+eg. if a single CMMFTransferBuffer is created upfront but a different
+transfer window (or the same transfer window with a different buffer mapped in
+is used). That is the same CMMFTransferBuffer but the actrual buffer may be different.
+
+Note: If the updated RTransferWindow is new, then the old buffer must
+be mapped out first by a call to CMMFTransferBuffer::MapOutBuffer() and the
+RtransferWindow handle closed outside the CMMFTransferBuffer.
+
+@param  aTransferWindow
+        The RTransferWindow to update - can be a new RTransferWindow
+        or the same RTransferWindow with a new RTransferBuffer mapped in.
+@param  aDataLength
+        The length of the data.
+
+@return An error code indicating if the function call was successful. KErrNone on success, otherwise
+        another of the system-wide error codes.
+*/
+EXPORT_C TInt CMMFTransferBuffer::UpdateTransferWindow(RTransferWindow& aTransferWindow, TUint aDataLength)
+	{
+//this method is not supported under EKA2
+	aTransferWindow = aTransferWindow;	//suppressed unused argument warnings
+	aDataLength =  aDataLength;			//suppressed unused argument warnings
+	return KErrNotSupported;
+	}
+
+/**
+Maps the buffer out of the transfer window.
+
+This method should be called in preference to
+calling MapOutBuffer directly on the RtransferWindow
+so that the CMMFTransferBuffer knows that it is no longer
+available.
+*/
+EXPORT_C void CMMFTransferBuffer::MapOutBuffer()
+	{
+	}
+
+
+
+/**
+Function to instantiate a CMMFPtrBuffer.
+This NewL creates an unititalised CMMFPtrBuffer.
+
+@return A pointer to a new CMMFPtrBuffer.
+*/
+EXPORT_C CMMFPtrBuffer* CMMFPtrBuffer::NewL()
+	{
+	CMMFPtrBuffer* self = new(ELeave) CMMFPtrBuffer;
+
+	return self;
+	}
+
+
+/**
+Function to instantiate a CMMFPtrBuffer.
+This NewL creates a CMMFPtrBuffer which owns a TPtr8.
+
+@param  aPtr
+        A reference to a TPtr containing the CMMFPtrBuffer data.
+
+@return A pointer to a new CMMFPtrBuffer.
+*/
+EXPORT_C CMMFPtrBuffer* CMMFPtrBuffer::NewL(const TPtr8& aPtr)
+	{
+	CMMFPtrBuffer* self = new(ELeave) CMMFPtrBuffer;
+	CleanupStack::PushL(self);
+	self->ConstructL(aPtr);
+	CleanupStack::Pop(self); // self
+	return self;
+	}
+
+/**
+ * ConstructL
+ *
+ * Internal ConstructL
+ * @internalTechnology
+ * @param	"aPtr"
+ *			Reference to a TPtr containing the CMMFPtrBuffer data
+ */
+void CMMFPtrBuffer::ConstructL(const TPtr8& aPtr)
+	{
+	iPtr.Set(aPtr);
+	}
+
+/**
+Destructor.
+
+Destructor does no deletion, as this buffer class does not own the memory.
+*/
+EXPORT_C CMMFPtrBuffer::~CMMFPtrBuffer()
+	{
+
+	}
+
+/**
+Returns a descriptor to the data contained in the CMMFPtrBuffer.
+
+@return	A reference to a TPtr containing the CMMFPtrBuffer data.
+*/
+TDes8& CMMFPtrBuffer::Data()
+	{
+	return iPtr;	
+	}
+
+/**
+Returns a descriptor to the data contained in the CMMFPtrBuffer.
+
+@return	A const reference to a TPtr containing the CMMFPtrBuffer data.
+*/
+const TDesC8& CMMFPtrBuffer::Data() const
+	{
+	return iPtr;	
+	}
+
+/**
+Returns the actual data size (ie. not the max length) of the
+data contained in the CMMFPtrBuffer.
+
+@return	The size in bytes of the data contained in the CMMFPtrBuffer.
+*/
+TUint CMMFPtrBuffer::BufferSize() const
+	{
+	return iPtr.Length();
+	}
+
+/**
+Sets the position.
+
+This function is used by components (eg. codecs) which read data from a buffer
+and wish to store a read position marker for further reads.
+
+Note: The position cannot exceed the size of the actual data not the maximum length.
+
+@param  aPosition
+        The position.
+*/
+void CMMFPtrBuffer::SetPosition (TUint aPosition)
+	{//used for repositioning
+	if (aPosition <= (TUint)iPtr.Length()) 
+		iPosition = aPosition;
+	else 
+		iPosition = (TUint)iPtr.Length();//tried to position beyond end of data
+	}
+
+/**
+Sets the request size.
+
+This method is used in cases where a component (eg. a data source) may not be able
+or be desirable to write to the entire max length of the buffer (eg. variable bit rate codecs).
+In this case, the SetRequestSizeL() can be set which can be read by the RequestSize()
+function in the component so that it knows to only write data upto the requested size
+and not fill the buffer up to its maximum length.
+
+@param  aSize
+        The request size.
+*/
+void CMMFPtrBuffer::SetRequestSizeL(TInt aSize)
+	{
+	if (aSize < 0)
+		User::Leave(KErrUnderflow);
+	else if (aSize > iPtr.MaxLength())
+		User::Leave(KErrOverflow);
+	else
+		iRequestSize = aSize;
+	}
+
+
+/**
+Overriden method to set the status.
+Resets the data size to 0 when the buffer becomes available.
+
+@param  aStatus
+        The buffer status. See enum TBufferStatus.
+*/
+void CMMFPtrBuffer::SetStatus(TBufferStatus aStatus)
+	{
+	CMMFBuffer::SetStatus(aStatus);
+	if (iStatus == EAvailable)
+		{//need to set size to 0
+		iPtr.Zero();
+		}
+	}
+
+
+/** 
+Takes a TPtr8 to pre-allocated memory.
+
+@param  aPtr
+		The pointer refernce.
+*/
+EXPORT_C void CMMFPtrBuffer::SetPtr(const TPtr8& aPtr)
+	{
+	iPtr.Set(aPtr);
+	}
+
+
+//This functions needs updating
+//should more CMMFDataBuffers be supported in future
+/**
+Static method which returns ETrue if the buffer UID is a supported
+CMMFDataBuffer type.
+
+Note:
+If the buffer is not a CMMFDataBuffer this method should
+return EFalse.
+
+@param  aUid
+        The UID of the CMMFBuffer to be checked for support.
+@return The buffer size.
+*/
+EXPORT_C TBool CMMFBuffer::IsSupportedDataBuffer(TUid aUid)
+	{ 
+	return((aUid == KUidMmfDescriptorBuffer)
+		|| (aUid == KUidMmfTransferBuffer)
+		|| (aUid == KUidMmfPtrBuffer));
+	}
+
+
+/**
+Static method which returns ETrue if the buffer UID is a buffer
+that is safe to be used with the file server.  If the buffer type
+is not safe to be used with the file server, then the client would
+need to copy the contents of the buffer, prior to passing it onto
+the file server.
+
+This implementation assumes the CMMFPtrBuffer is safe for file server copy. If this is not the case 
+then remove the PtrBuffer set to ETrue.
+
+@param  aUid
+        The UID of the CMMFBuffer to be checked for support.
+
+@return The buffer size.
+*/
+EXPORT_C TBool CMMFBuffer::IsFileServerSafe(TUid aUid)
+	{
+	TBool isFileServerSafe = EFalse;
+
+	if (aUid == KUidMmfDescriptorBuffer)
+		isFileServerSafe = ETrue;
+	if (aUid == KUidMmfPtrBuffer) //remove this if target CMMFPtrBuffers
+		isFileServerSafe = ETrue; //are not safe for file server copy
+	
+	return isFileServerSafe;
+	}