os/mm/devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceBuilder/src/CustomInterfaceBuilder.cpp
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/mm/devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceBuilder/src/CustomInterfaceBuilder.cpp Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,168 @@
1.4 +/*
1.5 +* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies).
1.6 +* All rights reserved.
1.7 +* This component and the accompanying materials are made available
1.8 +* under the terms of "Eclipse Public License v1.0"
1.9 +* which accompanies this distribution, and is available
1.10 +* at the URL "http://www.eclipse.org/legal/epl-v10.html".
1.11 +*
1.12 +* Initial Contributors:
1.13 +* Nokia Corporation - initial contribution.
1.14 +*
1.15 +* Contributors:
1.16 +*
1.17 +* Description: CustomInterface Builder
1.18 +*
1.19 +*/
1.20 +
1.21 +
1.22 +#include <CustomInterfaceBuilder.h>
1.23 +#include <sounddevice.h>
1.24 +#include <MessageHandlerFactory.h>
1.25 +#include "AdaptationCustomInterfaceBuilder.h"
1.26 +#include "CustomInterfaceBuilderTypes.h"
1.27 +
1.28 +#include "RestrictedAudioOutputMessageHandler.h"
1.29 +#include "AudioOutputMessageTypes.h"
1.30 +
1.31 +const TUid KUidCustomInterfaceBuilderImpl = {0x10207A8E};
1.32 +
1.33 +EXPORT_C CCustomInterfaceBuilder* CCustomInterfaceBuilder::NewL(CMMFObjectContainer& aObjectContainer,
1.34 + CMMFDevSound& aDevSound)
1.35 + {
1.36 + CCustomInterfaceBuilder* self = new(ELeave) CCustomInterfaceBuilder(aObjectContainer,
1.37 + aDevSound);
1.38 + CleanupStack::PushL(self);
1.39 + self->ConstructL();
1.40 + CleanupStack::Pop(self);
1.41 + return self;
1.42 + }
1.43 +
1.44 +EXPORT_C CCustomInterfaceBuilder* CCustomInterfaceBuilder::NewL(CMMFObjectContainer& aObjectContainer,
1.45 + MCustomInterface& aCustomInterface)
1.46 + {
1.47 + CCustomInterfaceBuilder* self = new(ELeave) CCustomInterfaceBuilder(aObjectContainer,
1.48 + aCustomInterface);
1.49 + CleanupStack::PushL(self);
1.50 + self->ConstructL();
1.51 + CleanupStack::Pop(self);
1.52 + return self;
1.53 + }
1.54 +
1.55 +CCustomInterfaceBuilder::CCustomInterfaceBuilder(CMMFObjectContainer& aObjectContainer,
1.56 + CMMFDevSound& aDevSound) :
1.57 + CMMFObject(KUidCustomInterfaceBuilderImpl),
1.58 + iDevSound(&aDevSound),
1.59 + iObjectContainer(aObjectContainer),
1.60 + iSecureCustomInterfaces(EFalse)
1.61 + {
1.62 + }
1.63 +
1.64 +CCustomInterfaceBuilder::CCustomInterfaceBuilder(CMMFObjectContainer& aObjectContainer,
1.65 + MCustomInterface& aCustomInterface) :
1.66 + CMMFObject(KUidCustomInterfaceBuilderImpl),
1.67 + iCustomInterface(&aCustomInterface),
1.68 + iObjectContainer(aObjectContainer),
1.69 + iSecureCustomInterfaces(EFalse)
1.70 + {
1.71 + }
1.72 +
1.73 +void CCustomInterfaceBuilder::ConstructL()
1.74 + {
1.75 + }
1.76 +
1.77 +CCustomInterfaceBuilder::~CCustomInterfaceBuilder()
1.78 + {
1.79 + }
1.80 +
1.81 +void CCustomInterfaceBuilder::HandleRequest(TMMFMessage& aMessage)
1.82 + {
1.83 + ASSERT(aMessage.Destination().InterfaceId() == KUidCustomInterfaceBuilderImpl);
1.84 + TRAPD(error,DoHandleRequestL(aMessage));
1.85 + if(error)
1.86 + {
1.87 + aMessage.Complete(error);
1.88 + }
1.89 + }
1.90 +
1.91 +void CCustomInterfaceBuilder::DoHandleRequestL(TMMFMessage& aMessage)
1.92 + {
1.93 + switch( aMessage.Function() )
1.94 + {
1.95 + case ECibBuild:
1.96 + DoBuildL(aMessage);
1.97 + break;
1.98 + case ECibRemove:
1.99 + DoRemoveL(aMessage);
1.100 + break;
1.101 +
1.102 + default:
1.103 + User::Leave(KErrNotSupported);
1.104 +
1.105 + }
1.106 +
1.107 + }
1.108 +
1.109 +void CCustomInterfaceBuilder::DoBuildL(TMMFMessage& aMessage)
1.110 + {
1.111 + TPckgBuf<TUid> uidPckg;
1.112 + aMessage.ReadData1FromClientL(uidPckg);
1.113 + TUid interfaceId = uidPckg();
1.114 + //only KUidRestrictedAudioOutput is blocked here.
1.115 + //KUidAudioOutput will be blocked in messageHandler for specific commands.
1.116 + if( iSecureCustomInterfaces && interfaceId==KUidRestrictedAudioOutput )
1.117 + {
1.118 + User::Leave( KErrNotSupported );
1.119 + }
1.120 +
1.121 + TMMFMessageDestination handle;
1.122 +
1.123 + TAny* customInterface = GetCustomInterfaceL(interfaceId);
1.124 + if(customInterface)
1.125 + {
1.126 + CMMFObject* messageHandler = CMessageHandlerFactory::Create(interfaceId, customInterface,iObjectContainer);
1.127 + if(messageHandler)
1.128 + {
1.129 + iObjectContainer.AddMMFObject(*messageHandler);
1.130 + handle = messageHandler->Handle();
1.131 + }
1.132 + }
1.133 + TMMFMessageDestinationPckg handlePckg(handle);
1.134 + aMessage.WriteDataToClient(handlePckg);
1.135 + aMessage.Complete(KErrNone);
1.136 + }
1.137 +
1.138 +void CCustomInterfaceBuilder::DoRemoveL(TMMFMessage& aMessage)
1.139 + {
1.140 + TMMFMessageDestinationPckg handlePckg;
1.141 + aMessage.ReadData1FromClientL(handlePckg);
1.142 +
1.143 + CMMFObject* messageHandler = NULL;
1.144 +
1.145 + if ( iObjectContainer.FindMMFObject(handlePckg(), messageHandler) == KErrNone )
1.146 + {
1.147 + iObjectContainer.RemoveAndDestroyMMFObject(*messageHandler);
1.148 + }
1.149 + aMessage.Complete(KErrNone);
1.150 +
1.151 +
1.152 + }
1.153 +
1.154 +TAny* CCustomInterfaceBuilder::GetCustomInterfaceL(TUid aInterfaceId)
1.155 + {
1.156 + TAny* customInterface = NULL;
1.157 + if (iDevSound)
1.158 + {
1.159 + customInterface = iDevSound->CustomInterface(aInterfaceId);
1.160 + }
1.161 + else if (iCustomInterface)
1.162 + {
1.163 + customInterface = iCustomInterface->CustomInterface(aInterfaceId);
1.164 + }
1.165 + return customInterface;
1.166 + }
1.167 +
1.168 +EXPORT_C void CCustomInterfaceBuilder::SetSecureCustomInterfaces( const TBool aSecure )
1.169 + {
1.170 + iSecureCustomInterfaces = aSecure;
1.171 + }