diff -r 000000000000 -r 40261b775718 devsound/a3fdevsound/src/mmfdevsoundserver/MmfDevSoundCIDeMuxUtility.cpp --- /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 +#include +#include + + +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 tempBuffer; + tempBuffer.Num(uidAsInteger, EHex); // has value + TUid interfaceUid = {KUidDevSoundCustomInterfaceDeMux}; + + TUid destructorKey; + MMMFDevSoundCustomInterfaceDeMuxPlugin* self = + static_cast + (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 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 idBuffer(interfaceUid); + + retVal = iInterface->DoOpenSlaveL(idBuffer(), tempBuf); + CleanupStack::PopAndDestroy(&tempBuf); + break; + } + case CMMFDevSoundCIMuxUtility::EMMFDevSoundCustomCommandCICloseSlave: + { + TPckgBuf 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 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 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) + { + } +