diff -r c1e808730d6c -r c36d67f77f75 devsound/devsoundpluginsupport/src/CustomInterfaces/cmmfdevsoundcibitrate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devsound/devsoundpluginsupport/src/CustomInterfaces/cmmfdevsoundcibitrate.cpp Thu Jun 24 10:37:45 2010 +0100 @@ -0,0 +1,459 @@ +/* +* Copyright (c) 2005 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 "cmmfdevsoundcibitrateimplementationuid.hrh" + +#include +#include +#include + +#include "cmmfdevsoundcibitrate.h" + +// __________________________________________________________________________ +// Implementation + +////////////////////////////////////////// MUX ///////////////////// + +TInt CMMFDevSoundCIBitRateMux::OpenInterface(TUid /*aInterfaceId*/) + { + // attempt to open the interface link with the + // remote slave device + iRemoteHandle = -1; + TUid slaveId = {KMmfUidCustomInterfaceBitRateDeMux}; + + TInt handle = iUtility->OpenSlave(slaveId, KNullDesC8); + if (handle >= 0) + { + iRemoteHandle = handle; + } + + return iRemoteHandle; + } + +void CMMFDevSoundCIBitRateMux::Release() + { + // close the slave device if it exists + if (iRemoteHandle != -1) + { + // we assume the slave is closed correctly + iUtility->CloseSlave(iRemoteHandle); + } + + TUid key = iKey; + delete this; + + // tell ECom to destroy us + REComSession::DestroyedImplementation(key); + } + +void CMMFDevSoundCIBitRateMux::PassDestructorKey(TUid aDestructorKey) + { + // store the destructor key + iKey = aDestructorKey; + } + +void CMMFDevSoundCIBitRateMux::CompleteConstructL(MMMFDevSoundCustomInterfaceMuxUtility* aCustomUtility) + { + // store a pointer to the utility + iUtility = aCustomUtility; + } + +MMMFDevSoundCustomInterfaceMuxPlugin* CMMFDevSoundCIBitRateMux::NewL() + { + CMMFDevSoundCIBitRateMux* self = new (ELeave) CMMFDevSoundCIBitRateMux; + return self; + } + +TAny* CMMFDevSoundCIBitRateMux::CustomInterface(TUid /*aInterfaceId*/) + { + MMMFDevSoundCustomInterfaceBitRate* interface = this; + return interface; + } + +CMMFDevSoundCIBitRateMux::CMMFDevSoundCIBitRateMux() : + iRemoteHandle(-1) + { + } + +CMMFDevSoundCIBitRateMux::~CMMFDevSoundCIBitRateMux() + { + } + +// from MMMFDevSoundCustomInterfaceBitRate +void CMMFDevSoundCIBitRateMux::GetSupportedBitRatesL(RArray& aSupportedBitRates) + { + if (iRemoteHandle == -1) + { + User::Leave(KErrNotReady); + } + + // first clear out the array + aSupportedBitRates.Reset(); + + // now fetch the count from the server + TInt count = -1; + count = iUtility->SendSlaveSyncCommand(iRemoteHandle, EMMFDevSoundCIBitRateGetSupportedBitRates, KNullDesC8); + + // if count is negative then the server side left with an error + if (count < 0) + { + User::Leave(count); + } + + // no point getting the data if the count is zero + if (count != 0) + { + // allocate a temporary buffer to hold the bitrates + HBufC8* buf = HBufC8::NewLC(count * sizeof(TInt32)); + TPtr8 ptr = buf->Des(); + + // fetch the bitrates - but send over the received count to be sure + TPckgBuf countBuf(count); + User::LeaveIfError(iUtility->SendSlaveSyncCommandResult( + iRemoteHandle, + EMMFDevSoundCIBitRateGetSupportedBitRatesArray, + countBuf, ptr)); + + // stream data into the pointer + RDesReadStream stream(ptr); + CleanupClosePushL(stream); + + TInt err = KErrNone; + for (TInt i = 0; i < count; i++) + { + // note we don't destroy array because we don't own it + // but we do reset it as it is incomplete + err = aSupportedBitRates.Append(stream.ReadInt32L()); + if (err != KErrNone) + { + aSupportedBitRates.Reset(); + User::Leave(KErrCorrupt); + } + } + + CleanupStack::PopAndDestroy(2, buf);// stream, buf + } + } + +TInt CMMFDevSoundCIBitRateMux::BitRateL() + { + if (iRemoteHandle == -1) + { + User::Leave(KErrNotReady); + } + + // send EMMFDevSoundCIBitRateBitRate command to slave + TInt bitrate = 0; + bitrate = iUtility->SendSlaveSyncCommand(iRemoteHandle, EMMFDevSoundCIBitRateBitRate, KNullDesC8); + + // if bitrate is negative then remote side left with an error + if (bitrate < 0) + { + User::Leave(bitrate); + } + + return bitrate; + } + +void CMMFDevSoundCIBitRateMux::SetBitRateL(TInt aBitRate) + { + if (iRemoteHandle == -1) + { + User::Leave(KErrNotReady); + } + + // send the bitrate in the sync command + TPckgBuf bitBuffer(aBitRate); + + // any return code other than zero is an error + User::LeaveIfError(iUtility->SendSlaveSyncCommand(iRemoteHandle, EMMFDevSoundCIBitRateSetBitRate, bitBuffer)); + } + +/////////////////////////////////////// DEMUX ////////////////////// + + +TInt CMMFDevSoundCIBitRateDeMux::OpenInterface(TUid /*aInterfaceId*/) + { + return KErrNone; + } + +void CMMFDevSoundCIBitRateDeMux::Release() + { + TUid key = iKey; + + delete this; + + // tell ECom to destroy us + REComSession::DestroyedImplementation(key); + } + +void CMMFDevSoundCIBitRateDeMux::PassDestructorKey(TUid aDestructorKey) + { + // store the destructor key + iKey = aDestructorKey; + } + +void CMMFDevSoundCIBitRateDeMux::SetInterfaceTarget(MMMFDevSoundCustomInterfaceTarget* aTarget) + { + iTarget = aTarget; + } + +void CMMFDevSoundCIBitRateDeMux::CompleteConstructL(MMMFDevSoundCustomInterfaceDeMuxUtility* aCustomUtility) + { + // store a pointer to the utility + iUtility = aCustomUtility; + } + +void CMMFDevSoundCIBitRateDeMux::RefreshL() + { + // refetch the bitrate custom interface if we already have a target + if (iTarget) + { + MMMFDevSoundCustomInterfaceBitRate* ptr = NULL; + ptr = static_cast (iTarget->CustomInterface(KUidCustomInterfaceDevSoundBitRate)); + + if (!ptr) + { + iBitRateInterface = NULL; + User::Leave(KErrNotSupported); + } + else + { + iBitRateInterface = ptr; + } + } + } + + +MMMFDevSoundCustomInterfaceDeMuxPlugin* CMMFDevSoundCIBitRateDeMux::NewL() + { + CMMFDevSoundCIBitRateDeMux* self = new (ELeave) CMMFDevSoundCIBitRateDeMux; + return self; + } + +CMMFDevSoundCIBitRateDeMux::CMMFDevSoundCIBitRateDeMux() + { + + } + +CMMFDevSoundCIBitRateDeMux::~CMMFDevSoundCIBitRateDeMux() + { + iBitRateArray.Reset(); + iBitRateArray.Close(); + } + + +TInt CMMFDevSoundCIBitRateDeMux::DoOpenSlaveL(TUid /*aInterface*/, const TDesC8& /*aPackageBuf*/) + { + // fetch the bitrate custom interface + MMMFDevSoundCustomInterfaceBitRate* ptr = NULL; + ptr = static_cast (iTarget->CustomInterface(KUidCustomInterfaceDevSoundBitRate)); + + if (!ptr) + { + iBitRateInterface = NULL; + User::Leave(KErrNotSupported); + } + else + { + iBitRateInterface = ptr; + } + return KErrNone; + } + +void CMMFDevSoundCIBitRateDeMux::DoCloseSlaveL(TInt /*aHandle*/) + { + // nothing to do + } + +// original RMessage is supplied so that remote demux plugin can extract necessary details +// using DeMux utility +TInt CMMFDevSoundCIBitRateDeMux::DoSendSlaveSyncCommandL(const RMmfIpcMessage& aMessage) + { + TMMFDevSoundCIMessageData data; + + // decode message + iUtility->GetSyncMessageDataL(aMessage, data); + TInt retVal = -1; + + switch (data.iCommand) + { + case EMMFDevSoundCIBitRateBitRate: + { + retVal = DoBitRateL(); + break; + } + case EMMFDevSoundCIBitRateSetBitRate: + { + // we know that offset 2 contains a TInt + TPckgBuf bitBuffer; + iUtility->ReadFromInputDesL(aMessage, &bitBuffer); + + DoSetBitRateL(bitBuffer()); + retVal = KErrNone; + break; + } + case EMMFDevSoundCIBitRateGetSupportedBitRates: + { + // reset the current bitrate array + iBitRateArray.Reset(); + DoGetSupportedBitRatesL(iBitRateArray); + + // send back the array count + TInt count = iBitRateArray.Count(); + retVal = count; + break; + } + default: + { + User::Leave(KErrNotSupported); + } + } + + return retVal; + } + +TInt CMMFDevSoundCIBitRateDeMux::DoSendSlaveSyncCommandResultL(const RMmfIpcMessage& aMessage) + { + TMMFDevSoundCIMessageData data; + + // decode message + iUtility->GetSyncMessageDataL(aMessage, data); + + switch (data.iCommand) + { + case EMMFDevSoundCIBitRateGetSupportedBitRatesArray: + { + DoCopyBitRateBufferToClientL(aMessage); + break; + } + default: + { + User::Leave(KErrNotSupported); + } + } + return KErrNone; + } + +void CMMFDevSoundCIBitRateDeMux::DoSendSlaveAsyncCommandL(const RMmfIpcMessage& /*aMessage*/) + { + // not used in this interface + } + +void CMMFDevSoundCIBitRateDeMux::DoSendSlaveAsyncCommandResultL(const RMmfIpcMessage& /*aMessage*/) + { + // not used in this interface + } + +// bitrate custom interface implementation +void CMMFDevSoundCIBitRateDeMux::DoGetSupportedBitRatesL(RArray& aSupportedBitRates) + { + if (!iBitRateInterface) + { + User::Leave(KErrNotReady); + } + + iBitRateInterface->GetSupportedBitRatesL(aSupportedBitRates); + } + + +void CMMFDevSoundCIBitRateDeMux::DoCopyBitRateBufferToClientL(const RMmfIpcMessage& aMessage) + { + if (!iBitRateInterface) + { + User::Leave(KErrNotReady); + } + + // check our count is the same as the client's + TPckgBuf countBuffer; + iUtility->ReadFromInputDesL(aMessage, &countBuffer); + + TInt count = countBuffer(); + if (count != iBitRateArray.Count()) + { + User::Leave(KErrCorrupt); + } + + // send back the array - the client has the count already + const TInt KBufExpandSize8 = 8; //two TInt's + CBufFlat* dataCopyBuffer = CBufFlat::NewL(KBufExpandSize8); + CleanupStack::PushL(dataCopyBuffer); + RBufWriteStream stream; + stream.Open(*dataCopyBuffer); + CleanupClosePushL(stream); + + for (TInt i = 0; i < count; i++) + { + stream.WriteInt32L(iBitRateArray[i]); + } + + // write the data to the supplied descriptor buffer + TPtr8 ptrBuf = dataCopyBuffer->Ptr(0); + iUtility->WriteToOutputDesL(aMessage, ptrBuf); + stream.Close(); + + CleanupStack::PopAndDestroy(2); // iDataCopyBuffer, stream + } + + +TInt CMMFDevSoundCIBitRateDeMux::DoBitRateL() + { + if (!iBitRateInterface) + { + User::Leave(KErrNotReady); + } + return iBitRateInterface->BitRateL(); + } + +void CMMFDevSoundCIBitRateDeMux::DoSetBitRateL(TInt aBitRate) + { + if (!iBitRateInterface) + { + User::Leave(KErrNotReady); + } + + // set the bitrate + iBitRateInterface->SetBitRateL(aBitRate); + } + + + +// +// ImplementationTable +// + +const TImplementationProxy ImplementationTable[] = + { + IMPLEMENTATION_PROXY_ENTRY(KMmfUidCustomInterfaceBitRateMux, CMMFDevSoundCIBitRateMux::NewL), + IMPLEMENTATION_PROXY_ENTRY(KMmfUidCustomInterfaceBitRateDeMux, CMMFDevSoundCIBitRateDeMux::NewL), + }; + + +// +// ImplementationGroupProxy +// +//////////////////////////////////////////////////////////////////////////////// + +EXPORT_C const TImplementationProxy* ImplementationGroupProxy(TInt& aTableCount) + { + aTableCount = sizeof(ImplementationTable) / sizeof(TImplementationProxy); + + return ImplementationTable; + } + +