sl@0: /* sl@0: * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: Audio output msg handler implementation sl@0: * sl@0: */ sl@0: sl@0: sl@0: sl@0: // INCLUDE FILES sl@0: #include "AudioOutput.h" sl@0: #include "AudioOutputMessageHandler.h" sl@0: #include "AudioOutputMessageTypes.h" sl@0: #include "MAudioOutputObserver.h" sl@0: sl@0: //reason for defining this secure id here but not using from the mmfbase.hrh is that sl@0: //lot of macros in mmfbase.hrh collide with base.hrh sl@0: #define KUidMmfDrmPluginServerDefine 0x10283439 sl@0: sl@0: // ================= MEMBER FUNCTIONS ======================= sl@0: sl@0: // C++ default constructor can NOT contain any code, that sl@0: // might leave. sl@0: // sl@0: CAudioOutputMessageHandler::CAudioOutputMessageHandler(CAudioOutput* aAudioOutput, sl@0: CMMFObjectContainer& aContainer) : sl@0: CMMFObject(KUidAudioOutput), sl@0: iContainer(aContainer) sl@0: { sl@0: iAudioOutput = aAudioOutput; sl@0: } sl@0: sl@0: // Two-phased constructor. sl@0: EXPORT_C CAudioOutputMessageHandler* CAudioOutputMessageHandler::NewL(TAny* aCustomInterface, sl@0: CMMFObjectContainer& aContainer) sl@0: { sl@0: CAudioOutput* audioOutput = (CAudioOutput*)aCustomInterface; sl@0: CAudioOutputMessageHandler* self = new (ELeave) CAudioOutputMessageHandler(audioOutput, sl@0: aContainer); sl@0: sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: sl@0: // Destructor sl@0: CAudioOutputMessageHandler::~CAudioOutputMessageHandler() sl@0: { sl@0: delete iAudioOutput; sl@0: delete iCallbackMessage; sl@0: } sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::AudioOutputL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: EXPORT_C TUid CAudioOutputMessageHandler::Uid() sl@0: { sl@0: return KUidAudioOutput; sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::SetAudioOutputL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::HandleRequest(TMMFMessage& aMessage) sl@0: { sl@0: ASSERT(aMessage.Destination().InterfaceId() == KUidAudioOutput); sl@0: TRAPD(error,DoHandleRequestL(aMessage)); sl@0: if(error) sl@0: { sl@0: aMessage.Complete(error); sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoHandleRequestL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoHandleRequestL(TMMFMessage& aMessage) sl@0: { sl@0: sl@0: switch(aMessage.Function()) sl@0: { sl@0: case EAofDelete: sl@0: { sl@0: DoDeleteL(aMessage); sl@0: break; sl@0: } sl@0: case EAofRegisterObserver: sl@0: { sl@0: iCallbackMessage = new (ELeave) TMMFMessage( aMessage ); sl@0: DoRegisterObserverL(); sl@0: break; sl@0: } sl@0: case EAofSetAudioOutput: sl@0: { sl@0: DoSetAudioOutputL(aMessage); sl@0: break; sl@0: } sl@0: case EAofGetAudioOutput: sl@0: { sl@0: DoGetAudioOutputL(aMessage); sl@0: break; sl@0: } sl@0: case EAofSetSecureOutput: sl@0: { sl@0: DoSetSecureOutputL(aMessage); sl@0: break; sl@0: } sl@0: case EAofUnregisterObserver: sl@0: { sl@0: DoUnregisterObserverL(aMessage); sl@0: break; sl@0: } sl@0: default: sl@0: { sl@0: aMessage.Complete(KErrNotSupported); sl@0: } sl@0: } sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoDeleteL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoDeleteL(TMMFMessage& aMessage) sl@0: { sl@0: aMessage.Complete(KErrNone); sl@0: iContainer.RemoveAndDestroyMMFObject(*this); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoRegisterObserverL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoRegisterObserverL() sl@0: { sl@0: iAudioOutput->RegisterObserverL(*this); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoSetAudioOutputL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoSetAudioOutputL(TMMFMessage& aMessage) sl@0: { sl@0: TPckgBuf outputPckg; sl@0: aMessage.ReadData1FromClient(outputPckg); sl@0: CAudioOutput::TAudioOutputPreference output = outputPckg(); sl@0: iAudioOutput->SetAudioOutputL(output); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoSetSecureOutputL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoSetSecureOutputL(TMMFMessage& aMessage) sl@0: { sl@0: //Since we allow the creation of CAudioOutput from Custom interface builder. sl@0: //We have to make sure that this message is blocked in case we are running in Secure DRM process sl@0: const TSecureId KSecureDRMSID(KUidMmfDrmPluginServerDefine); sl@0: RThread currentThread; sl@0: RProcess currentProcess; sl@0: CleanupClosePushL(currentThread); sl@0: CleanupClosePushL(currentProcess); sl@0: User::LeaveIfError(currentThread.Process(currentProcess)); sl@0: TSecureId curProcessSID = currentProcess.SecureId(); sl@0: CleanupStack::PopAndDestroy();//calls currentThread.Close() sl@0: CleanupStack::PopAndDestroy();//calls currentProcess.Close() sl@0: if (curProcessSID == KSecureDRMSID) sl@0: { sl@0: //since we are in secure DRM process, completing request with KErrPermissionDenied. sl@0: aMessage.Complete(KErrPermissionDenied); sl@0: return; sl@0: } sl@0: TPckgBuf secureOutputPckg; sl@0: aMessage.ReadData1FromClient(secureOutputPckg); sl@0: TBool secureOutput = secureOutputPckg(); sl@0: iAudioOutput->SetSecureOutputL(secureOutput); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoUnregisterObserverL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoUnregisterObserverL(TMMFMessage& aMessage) sl@0: { sl@0: iAudioOutput->UnregisterObserver(*this); sl@0: if ( iCallbackMessage ) sl@0: { sl@0: if ( !iCallbackMessage->IsCompleted() ) sl@0: { sl@0: iCallbackMessage->Complete(KErrNone); sl@0: } sl@0: } sl@0: aMessage.Complete(KErrNone); sl@0: delete iCallbackMessage; sl@0: iCallbackMessage = NULL; sl@0: } sl@0: sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DefaultAudioOutputChanged sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DefaultAudioOutputChanged( CAudioOutput& /*aAudioOutput*/, sl@0: CAudioOutput::TAudioOutputPreference aNewDefault ) sl@0: { sl@0: TPckgBuf outputPckg(aNewDefault); sl@0: sl@0: if ( iCallbackMessage ) sl@0: { sl@0: if ( !iCallbackMessage->IsCompleted() ) sl@0: { sl@0: iCallbackMessage->WriteDataToClient( outputPckg ); sl@0: iCallbackMessage->Complete( KErrNone ); sl@0: } sl@0: } sl@0: delete iCallbackMessage; sl@0: iCallbackMessage = NULL; sl@0: } sl@0: sl@0: sl@0: // ----------------------------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::ConstructL sl@0: // Symbian 2nd phase constructor can leave. sl@0: // ----------------------------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::ConstructL() sl@0: { sl@0: } sl@0: sl@0: // --------------------------------------------------------- sl@0: // CAudioOutputMessageHandler::DoSetAudioOutputL sl@0: // ?implementation_description sl@0: // (other items were commented in a header). sl@0: // --------------------------------------------------------- sl@0: // sl@0: void CAudioOutputMessageHandler::DoGetAudioOutputL(TMMFMessage& aMessage) sl@0: { sl@0: #ifdef _DEBUG sl@0: RDebug::Print(_L("CAudioOutputMessageHandler::DoGetAudioOutputL")); sl@0: #endif sl@0: CAudioOutput::TAudioOutputPreference outPut = iAudioOutput->AudioOutput(); sl@0: TPckgBuf outPutPckg(outPut); sl@0: aMessage.WriteDataToClient(outPutPckg); sl@0: aMessage.Complete(KErrNone); sl@0: } sl@0: // ========================== OTHER EXPORTED FUNCTIONS ========================= sl@0: sl@0: sl@0: sl@0: // End of File