devsoundextensions/audiorouting/Output/AudioOutputMessageHandler/src/AudioOutputMessageHandler.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsoundextensions/audiorouting/Output/AudioOutputMessageHandler/src/AudioOutputMessageHandler.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,285 @@
+/*
+* Copyright (c) 2006 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: Audio output msg handler implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "AudioOutput.h"
+#include "AudioOutputMessageHandler.h"
+#include "AudioOutputMessageTypes.h"
+#include "MAudioOutputObserver.h"
+
+//reason for defining this secure id here but not using from the mmfbase.hrh is that
+//lot of macros in mmfbase.hrh collide with base.hrh
+#define KUidMmfDrmPluginServerDefine 0x10283439
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CAudioOutputMessageHandler::CAudioOutputMessageHandler(CAudioOutput* aAudioOutput,
+ CMMFObjectContainer& aContainer) :
+ CMMFObject(KUidAudioOutput),
+ iContainer(aContainer)
+ {
+ iAudioOutput = aAudioOutput;
+ }
+
+// Two-phased constructor.
+EXPORT_C CAudioOutputMessageHandler* CAudioOutputMessageHandler::NewL(TAny* aCustomInterface,
+ CMMFObjectContainer& aContainer)
+ {
+ CAudioOutput* audioOutput = (CAudioOutput*)aCustomInterface;
+ CAudioOutputMessageHandler* self = new (ELeave) CAudioOutputMessageHandler(audioOutput,
+ aContainer);
+
+ self->ConstructL();
+ return self;
+ }
+
+
+// Destructor
+CAudioOutputMessageHandler::~CAudioOutputMessageHandler()
+ {
+ delete iAudioOutput;
+ delete iCallbackMessage;
+ }
+
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::AudioOutputL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+EXPORT_C TUid CAudioOutputMessageHandler::Uid()
+ {
+ return KUidAudioOutput;
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::SetAudioOutputL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::HandleRequest(TMMFMessage& aMessage)
+ {
+ ASSERT(aMessage.Destination().InterfaceId() == KUidAudioOutput);
+ TRAPD(error,DoHandleRequestL(aMessage));
+ if(error)
+ {
+ aMessage.Complete(error);
+ }
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoHandleRequestL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoHandleRequestL(TMMFMessage& aMessage)
+ {
+
+ switch(aMessage.Function())
+ {
+ case EAofDelete:
+ {
+ DoDeleteL(aMessage);
+ break;
+ }
+ case EAofRegisterObserver:
+ {
+ iCallbackMessage = new (ELeave) TMMFMessage( aMessage );
+ DoRegisterObserverL();
+ break;
+ }
+ case EAofSetAudioOutput:
+ {
+ DoSetAudioOutputL(aMessage);
+ break;
+ }
+ case EAofGetAudioOutput:
+ {
+ DoGetAudioOutputL(aMessage);
+ break;
+ }
+ case EAofSetSecureOutput:
+ {
+ DoSetSecureOutputL(aMessage);
+ break;
+ }
+ case EAofUnregisterObserver:
+ {
+ DoUnregisterObserverL(aMessage);
+ break;
+ }
+ default:
+ {
+ aMessage.Complete(KErrNotSupported);
+ }
+ }
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoDeleteL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoDeleteL(TMMFMessage& aMessage)
+ {
+ aMessage.Complete(KErrNone);
+ iContainer.RemoveAndDestroyMMFObject(*this);
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoRegisterObserverL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoRegisterObserverL()
+ {
+ iAudioOutput->RegisterObserverL(*this);
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoSetAudioOutputL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoSetAudioOutputL(TMMFMessage& aMessage)
+ {
+ TPckgBuf<CAudioOutput::TAudioOutputPreference> outputPckg;
+ aMessage.ReadData1FromClient(outputPckg);
+ CAudioOutput::TAudioOutputPreference output = outputPckg();
+ iAudioOutput->SetAudioOutputL(output);
+ aMessage.Complete(KErrNone);
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoSetSecureOutputL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoSetSecureOutputL(TMMFMessage& aMessage)
+ {
+ //Since we allow the creation of CAudioOutput from Custom interface builder.
+ //We have to make sure that this message is blocked in case we are running in Secure DRM process
+ const TSecureId KSecureDRMSID(KUidMmfDrmPluginServerDefine);
+ RThread currentThread;
+ RProcess currentProcess;
+ CleanupClosePushL(currentThread);
+ CleanupClosePushL(currentProcess);
+ User::LeaveIfError(currentThread.Process(currentProcess));
+ TSecureId curProcessSID = currentProcess.SecureId();
+ CleanupStack::PopAndDestroy();//calls currentThread.Close()
+ CleanupStack::PopAndDestroy();//calls currentProcess.Close()
+ if (curProcessSID == KSecureDRMSID)
+ {
+ //since we are in secure DRM process, completing request with KErrPermissionDenied.
+ aMessage.Complete(KErrPermissionDenied);
+ return;
+ }
+ TPckgBuf<TBool> secureOutputPckg;
+ aMessage.ReadData1FromClient(secureOutputPckg);
+ TBool secureOutput = secureOutputPckg();
+ iAudioOutput->SetSecureOutputL(secureOutput);
+ aMessage.Complete(KErrNone);
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoUnregisterObserverL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoUnregisterObserverL(TMMFMessage& aMessage)
+ {
+ iAudioOutput->UnregisterObserver(*this);
+ if ( iCallbackMessage )
+ {
+ if ( !iCallbackMessage->IsCompleted() )
+ {
+ iCallbackMessage->Complete(KErrNone);
+ }
+ }
+ aMessage.Complete(KErrNone);
+ delete iCallbackMessage;
+ iCallbackMessage = NULL;
+ }
+
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DefaultAudioOutputChanged
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DefaultAudioOutputChanged( CAudioOutput& /*aAudioOutput*/,
+ CAudioOutput::TAudioOutputPreference aNewDefault )
+ {
+ TPckgBuf<CAudioOutput::TAudioOutputPreference> outputPckg(aNewDefault);
+
+ if ( iCallbackMessage )
+ {
+ if ( !iCallbackMessage->IsCompleted() )
+ {
+ iCallbackMessage->WriteDataToClient( outputPckg );
+ iCallbackMessage->Complete( KErrNone );
+ }
+ }
+ delete iCallbackMessage;
+ iCallbackMessage = NULL;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CAudioOutputMessageHandler::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CAudioOutputMessageHandler::ConstructL()
+ {
+ }
+
+// ---------------------------------------------------------
+// CAudioOutputMessageHandler::DoSetAudioOutputL
+// ?implementation_description
+// (other items were commented in a header).
+// ---------------------------------------------------------
+//
+void CAudioOutputMessageHandler::DoGetAudioOutputL(TMMFMessage& aMessage)
+ {
+#ifdef _DEBUG
+ RDebug::Print(_L("CAudioOutputMessageHandler::DoGetAudioOutputL"));
+#endif
+ CAudioOutput::TAudioOutputPreference outPut = iAudioOutput->AudioOutput();
+ TPckgBuf<CAudioOutput::TAudioOutputPreference> outPutPckg(outPut);
+ aMessage.WriteDataToClient(outPutPckg);
+ aMessage.Complete(KErrNone);
+ }
+// ========================== OTHER EXPORTED FUNCTIONS =========================
+
+
+
+// End of File