devsound/a3fdevsound/src/mmfdevsoundserver/MmfDevSoundCIDeMuxUtility.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/a3fdevsound/src/mmfdevsoundserver/MmfDevSoundCIDeMuxUtility.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,207 @@
+// Copyright (c) 2005-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:
+//
+
+#include "MmfDevSoundCIDeMuxUtility.h"
+#include "MmfDevSoundCIMuxUtility.h" // included for command definitions
+#include <mmf/plugin/mmfdevsoundcustominterface.hrh>
+#include <ecom/ecom.h>
+#include <mm/mmpluginutils.h>
+
+
+CMMFDevSoundCIDeMuxUtility* CMMFDevSoundCIDeMuxUtility::NewL(MMMFDevSoundCustomInterfaceDeMuxInterface* aInterface)
+	{
+	CMMFDevSoundCIDeMuxUtility* self = new (ELeave) CMMFDevSoundCIDeMuxUtility(aInterface);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+void CMMFDevSoundCIDeMuxUtility::ConstructL()
+	{
+	// nothing to do in this plugin
+	}
+
+CMMFDevSoundCIDeMuxUtility::~CMMFDevSoundCIDeMuxUtility()
+	{
+
+	}
+
+const TInt KDeMuxTempBufferSize = 20;
+
+// create a custom interface Mux implementation
+MMMFDevSoundCustomInterfaceDeMuxPlugin* CMMFDevSoundCIDeMuxUtility::CreateCustomInterfaceDeMuxL(TUid aInterfaceId)
+	{
+	// The Uid of the plugin will be the match string
+	TInt uidAsInteger = aInterfaceId.iUid;
+
+	TBuf8<KDeMuxTempBufferSize> tempBuffer;
+	tempBuffer.Num(uidAsInteger, EHex); // has value
+	TUid interfaceUid = {KUidDevSoundCustomInterfaceDeMux};
+	
+	TUid destructorKey;
+	MMMFDevSoundCustomInterfaceDeMuxPlugin* self = 
+		static_cast<MMMFDevSoundCustomInterfaceDeMuxPlugin*>
+		(MmPluginUtils::CreateImplementationL(interfaceUid, destructorKey, tempBuffer, KRomOnlyResolverUid));
+
+	// pass the destructor key so class can destroy itself
+	self->PassDestructorKey(destructorKey);
+	CleanupReleasePushL(*self);
+
+	// attempt to construct the plugin
+	self->CompleteConstructL(this);
+	CleanupStack::Pop();	// self
+	
+	return self;
+	}
+
+	
+// this will leave if the command is not a supported custom interface command
+// the integer being returned is not an error code per-se it is the return code
+// from the message being handled and so it makes sense here to have the function
+// returning an integer but also able to leave if there is a problem
+TInt CMMFDevSoundCIDeMuxUtility::ProcessCustomInterfaceCommandL(const RMmfIpcMessage& aMessage)
+	{
+	TPckgBuf<TA3FCustomInterfaceCommand> commandBuf;
+	MmfMessageUtil::ReadL(aMessage, 1, commandBuf);
+	CMMFDevSoundCIMuxUtility::TMMFDevSoundCustomCommand commandType = commandBuf().iType;
+	TInt handle = commandBuf().iHandle;
+	TInt retVal = KErrNotFound;
+	
+	switch (commandType)
+		{
+		case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCIOpenSlave:
+			{
+			// get a local copy of descriptor
+			RBuf8 tempBuf;
+			tempBuf.CleanupClosePushL();
+			TInt len = InputDesLength(aMessage);
+			if (len < 0)
+				{
+				User::Leave(KErrBadDescriptor);
+				}
+			else
+				{
+				tempBuf.CreateL(len);
+				}
+			ReadFromInputDesL(aMessage, &tempBuf);
+			
+			TUid interfaceUid(KNullUid);
+			interfaceUid.iUid = handle;
+			TPckgBuf<TUid> idBuffer(interfaceUid);
+			
+			retVal = iInterface->DoOpenSlaveL(idBuffer(), tempBuf);		
+			CleanupStack::PopAndDestroy(&tempBuf);
+			break;
+			}
+		case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCICloseSlave:
+			{
+			TPckgBuf<TInt> handleBuffer(handle);
+			iInterface->DoCloseSlaveL(handleBuffer());
+			retVal = KErrNone; // no return from CloseSlave
+			break;
+			}
+		case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCISendSlaveSyncCommand:
+			{
+			retVal = iInterface->DoSendSlaveSyncCommandL(aMessage);
+			break;
+			}
+		case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCISendSlaveSyncCommandResult:
+			{
+			retVal = iInterface->DoSendSlaveSyncCommandResultL(aMessage);
+			break;
+			}
+		case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCISendSlaveAsyncCommand:
+			{
+			iInterface->DoSendSlaveAsyncCommandL(aMessage);
+			retVal = KErrNone; // no return from async
+			break;
+			}
+		case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCISendSlaveAsyncCommandResult:
+			{
+			iInterface->DoSendSlaveAsyncCommandResultL(aMessage);
+			retVal = KErrNone;	// no return from async
+			break;
+			}
+		default:
+			User::Leave(retVal);
+		}
+		
+	return retVal;
+	}
+	
+
+// at the moment these two functions are the same but this may change on different platforms
+// so separate sync and async message data functions have been defined
+void CMMFDevSoundCIDeMuxUtility::GetSyncMessageDataL(const RMmfIpcMessage& aMessage, TMMFDevSoundCIMessageData& aData)
+	{
+	// data is stored as destination, custom command info, inbuf, outbuf
+	TPckgBuf<TA3FCustomInterfaceCommand> comBuffer;
+	aMessage.ReadL(1, comBuffer);
+	
+	// get command and handle
+	aData.iCommand = comBuffer().iCommand;
+	aData.iHandle = comBuffer().iHandle;
+	}
+	
+void CMMFDevSoundCIDeMuxUtility::GetAsyncMessageDataL(const RMmfIpcMessage& aMessage, TMMFDevSoundCIMessageData& aData)
+	{
+	// data is stored as destination, custom command info, inbuf, outbuf,status 
+	TPckgBuf<TA3FCustomInterfaceCommand> comBuffer;
+	aMessage.ReadL(1, comBuffer);
+	
+	// get command and handle
+	aData.iCommand = comBuffer().iCommand;
+	aData.iHandle = comBuffer().iHandle;
+	}
+
+
+TInt CMMFDevSoundCIDeMuxUtility::InputDesLength(const RMmfIpcMessage& aMessage)
+	{
+	// input descriptor is at offset 2
+	TInt len = aMessage.GetDesLength(2);	
+	return len;
+	}
+
+void CMMFDevSoundCIDeMuxUtility::ReadFromInputDesL(const RMmfIpcMessage& aMessage, TDes8* aBufToFill)
+	{
+	// check if the descriptor is large enough
+	TInt len = InputDesLength(aMessage);
+	if (len > aBufToFill->MaxLength())
+		{
+		User::Leave(KErrArgument);
+		}
+	
+	// input descriptor is at offset 2
+	aMessage.ReadL(2, *aBufToFill);
+	}
+	
+void CMMFDevSoundCIDeMuxUtility::WriteToOutputDesL(const RMmfIpcMessage& aMessage, TDesC8& aBufToWrite)
+	{
+	// output descriptor is at offset 3
+	aMessage.WriteL(3, aBufToWrite);
+	}
+
+	
+void CMMFDevSoundCIDeMuxUtility::CompleteMessage(const RMmfIpcMessage& aMessage, TInt aError)
+	{
+	aMessage.Complete(aError);
+	}
+
+CMMFDevSoundCIDeMuxUtility::CMMFDevSoundCIDeMuxUtility(MMMFDevSoundCustomInterfaceDeMuxInterface* aInterface)
+: iInterface(aInterface)
+	{
+	}
+