devsoundextensions/mmextfw/custominterfaceutility/CustomInterfaceBuilder/src/CustomInterfaceBuilder.cpp
author hgs
Tue, 02 Nov 2010 12:28:51 +0000
changeset 6 fe9d1bf55678
parent 0 b8ed18f6c07b
permissions -rw-r--r--
2010wk46_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     1
/*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     2
* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     3
* All rights reserved.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     8
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
     9
* Initial Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    11
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    12
* Contributors:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    13
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    14
* Description:   CustomInterface Builder
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    15
*
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    16
*/
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    17
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    18
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    19
#include <CustomInterfaceBuilder.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    20
#include <sounddevice.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    21
#include <MessageHandlerFactory.h>
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    22
#include "AdaptationCustomInterfaceBuilder.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    23
#include "CustomInterfaceBuilderTypes.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    24
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    25
#include "RestrictedAudioOutputMessageHandler.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    26
#include "AudioOutputMessageTypes.h"
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    27
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    28
const TUid KUidCustomInterfaceBuilderImpl = {0x10207A8E};
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    29
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    30
EXPORT_C CCustomInterfaceBuilder* CCustomInterfaceBuilder::NewL(CMMFObjectContainer& aObjectContainer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    31
                                                                CMMFDevSound&        aDevSound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    32
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    33
	CCustomInterfaceBuilder* self = new(ELeave) CCustomInterfaceBuilder(aObjectContainer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    34
	                                                                    aDevSound);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    35
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    36
	self->ConstructL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    37
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    38
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    39
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    40
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    41
EXPORT_C CCustomInterfaceBuilder* CCustomInterfaceBuilder::NewL(CMMFObjectContainer& aObjectContainer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    42
                                                                MCustomInterface& aCustomInterface)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    43
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    44
	CCustomInterfaceBuilder* self = new(ELeave) CCustomInterfaceBuilder(aObjectContainer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    45
	                                                                    aCustomInterface);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    46
	CleanupStack::PushL(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    47
	self->ConstructL();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    48
	CleanupStack::Pop(self);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    49
	return self;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    50
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    51
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    52
CCustomInterfaceBuilder::CCustomInterfaceBuilder(CMMFObjectContainer& aObjectContainer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    53
                                                 CMMFDevSound&        aDevSound) :
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    54
    CMMFObject(KUidCustomInterfaceBuilderImpl),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    55
    iDevSound(&aDevSound),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    56
	iObjectContainer(aObjectContainer),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    57
	iSecureCustomInterfaces(EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    58
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    59
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    60
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    61
CCustomInterfaceBuilder::CCustomInterfaceBuilder(CMMFObjectContainer& aObjectContainer,
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    62
                                                 MCustomInterface& aCustomInterface) :
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    63
    CMMFObject(KUidCustomInterfaceBuilderImpl),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    64
	iCustomInterface(&aCustomInterface),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    65
	iObjectContainer(aObjectContainer),
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    66
	iSecureCustomInterfaces(EFalse)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    67
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    68
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    69
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    70
void CCustomInterfaceBuilder::ConstructL()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    71
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    72
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    73
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    74
CCustomInterfaceBuilder::~CCustomInterfaceBuilder()
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    75
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    76
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    77
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    78
void CCustomInterfaceBuilder::HandleRequest(TMMFMessage& aMessage)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    79
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    80
	ASSERT(aMessage.Destination().InterfaceId() == KUidCustomInterfaceBuilderImpl);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    81
	TRAPD(error,DoHandleRequestL(aMessage));
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    82
	if(error)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    83
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    84
		aMessage.Complete(error);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    85
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    86
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    87
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    88
void CCustomInterfaceBuilder::DoHandleRequestL(TMMFMessage& aMessage)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    89
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    90
	switch( aMessage.Function() )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    91
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    92
		case ECibBuild:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    93
			DoBuildL(aMessage);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    94
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    95
		case ECibRemove:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    96
			DoRemoveL(aMessage);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    97
			break;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    98
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
    99
		default:
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   100
			User::Leave(KErrNotSupported);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   101
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   102
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   103
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   104
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   105
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   106
void CCustomInterfaceBuilder::DoBuildL(TMMFMessage& aMessage)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   107
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   108
	TPckgBuf<TUid> uidPckg;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   109
	aMessage.ReadData1FromClientL(uidPckg);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   110
	TUid interfaceId = uidPckg();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   111
	//only KUidRestrictedAudioOutput is blocked here. 
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   112
    //KUidAudioOutput will be blocked in messageHandler for specific commands.
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   113
	if( iSecureCustomInterfaces && interfaceId==KUidRestrictedAudioOutput )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   114
	    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   115
	    User::Leave( KErrNotSupported );
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   116
	    }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   117
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   118
	TMMFMessageDestination handle;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   119
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   120
	TAny* customInterface = GetCustomInterfaceL(interfaceId);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   121
	if(customInterface)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   122
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   123
		CMMFObject* messageHandler = CMessageHandlerFactory::Create(interfaceId, customInterface,iObjectContainer);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   124
		if(messageHandler)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   125
			{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   126
			iObjectContainer.AddMMFObject(*messageHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   127
			handle = messageHandler->Handle();
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   128
			}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   129
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   130
	TMMFMessageDestinationPckg handlePckg(handle);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   131
	aMessage.WriteDataToClient(handlePckg);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   132
	aMessage.Complete(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   133
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   134
	
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   135
void CCustomInterfaceBuilder::DoRemoveL(TMMFMessage& aMessage)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   136
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   137
	TMMFMessageDestinationPckg handlePckg;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   138
	aMessage.ReadData1FromClientL(handlePckg);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   139
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   140
	CMMFObject* messageHandler = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   141
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   142
	if ( iObjectContainer.FindMMFObject(handlePckg(), messageHandler) == KErrNone )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   143
		{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   144
		iObjectContainer.RemoveAndDestroyMMFObject(*messageHandler);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   145
		}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   146
	aMessage.Complete(KErrNone);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   147
		
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   148
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   149
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   150
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   151
TAny* CCustomInterfaceBuilder::GetCustomInterfaceL(TUid aInterfaceId)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   152
	{
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   153
	TAny* customInterface = NULL;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   154
    if (iDevSound)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   155
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   156
        customInterface = iDevSound->CustomInterface(aInterfaceId);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   157
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   158
    else if (iCustomInterface)
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   159
        {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   160
        customInterface = iCustomInterface->CustomInterface(aInterfaceId);
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   161
        }
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   162
	return customInterface;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   163
	}
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   164
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   165
EXPORT_C void CCustomInterfaceBuilder::SetSecureCustomInterfaces( const TBool aSecure )
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   166
    {
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   167
    iSecureCustomInterfaces = aSecure;
b8ed18f6c07b 2010wk40
hgs
parents:
diff changeset
   168
    }