--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/devsound/sounddevbt/src/server/Policy/MmfBtAudioPolicySession.cpp Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,311 @@
+// Copyright (c) 2000-2009 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 "MmfBtAudioPolicySession.h"
+#include "MmfBtPolicyClientServer.h"
+#include "MmfBtAudioPolicyServer.h"
+#include "MmfBtDevSoundInfo.h"
+
+
+
+CMMFAudioPolicySession* CMMFAudioPolicySession::NewL()
+ {
+ CMMFAudioPolicySession* self = new(ELeave) CMMFAudioPolicySession();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+ }
+
+void CMMFAudioPolicySession::ConstructL()
+ {
+ iAudioPolicyRequest = new (ELeave) CMMFAudioPolicyRequest();
+ }
+
+CMMFAudioPolicySession::CMMFAudioPolicySession() : iEventsQue(_FOFF(TMMFAudioPolicyEventHolder,iLink))
+ {
+ }
+
+void CMMFAudioPolicySession::CreateL(const CMmfIpcServer& aServer)
+ {
+ iServer = STATIC_CAST(CMMFAudioPolicyServer*, (CONST_CAST(CMmfIpcServer*, &aServer)));
+ iServer->IncrementSessionCount();
+ CMmfIpcSession::CreateL(aServer);
+ iServer->IncrementSessionId();
+ iPolicySessionId = iServer->PolicySessionId();
+ // Get ptr to AudioPolicy from the server
+ iAudioPolicy = iServer->AudioPolicy();
+ (iAudioPolicy->AudioPolicyRequestArray())->SetReserveL(iServer->PolicySessionCount());
+ }
+
+CMMFAudioPolicyServer* CMMFAudioPolicySession::Server()
+ {
+ return STATIC_CAST(CMMFAudioPolicyServer*, iServer);
+ }
+
+CMMFAudioPolicySession::~CMMFAudioPolicySession()
+ {
+ delete iEventReceiver;
+ delete iAudioPolicyRequest;
+ iEventReceiver=NULL;
+ if (!iEventsQue.IsEmpty())
+ {
+ TMMFAudioPolicyEventHolder* heldEvent = iEventsQue.First();
+ iEventsQue.Remove(*heldEvent);
+ delete heldEvent;
+ }
+ iAudioPolicyPrioritySettings.iState = EMMFStateClosed;
+ // Have session's CMMFAudioPolicyRequest object removed from list
+ iAudioPolicy->RemoveFromList(iPolicySessionId);
+ iServer->DecrementSessionCount();
+ iServer->StopNotificationTimer();
+ }
+
+void CMMFAudioPolicySession::ServiceL(const RMmfIpcMessage& aMessage)
+ {
+ TBool complete = EFalse;
+ switch(aMessage.Function())
+ {
+ case EMMFPolicyMakeRequest:
+ MakeRequestL(aMessage);
+ aMessage.Complete(KErrNone);
+ break;
+ case EMMFPolicySetDevSoundInfo:
+ complete = SetDevSoundInfoL(aMessage);
+ break;
+ case EMMFPolicyUpdateState:
+ complete = UpdateStateL(aMessage);
+ break;
+ case EMMFPolicyReceiveEvents:
+ complete = ReceiveEventsL(aMessage);
+ break;
+ case EMMFPolicyCancelReceiveEvents:
+ complete = CancelReceiveEvents();
+ break;
+ case EMMFPolicyGetPlayFormatsSupported:
+ complete = GetPlayFormatsSupportedL(aMessage);
+ break;
+ case EMMFPolicyGetRecordFormatsSupported:
+ complete = GetRecordFormatsSupportedL(aMessage);
+ break;
+ case EMMFPolicyGetPlayFormat:
+ complete = GetPlayFormatL(aMessage);
+ break;
+ case EMMFPolicyGetRecordFormat:
+ complete = GetRecordFormatL(aMessage);
+ break;
+ case EMMFPolicyLaunchRequests:
+ complete = LaunchRequest();
+ break;
+ case EMMFPolicyRequestResourceNotification:
+ complete = RequestResourceNotificationL(aMessage);
+ break;
+ case EMMFPolicyCancelRequestResourceNotification:
+ complete = CancelRequestResourceNotificationL(aMessage);
+ break;
+ case EMMFPolicyStopNotification:
+ complete = StopNotificationL(aMessage);
+ break;
+ case EMMFPolicyGetResourceNotificationEvent:
+ complete = GetResourceNotificationEventL(aMessage);
+ break;
+ default:
+ User::Leave(KErrNotSupported);
+ break;
+ }
+ if(complete)
+ {
+ aMessage.Complete(KErrNone);
+ }
+ }
+
+void CMMFAudioPolicySession::MakeRequestL(const RMmfIpcMessage& aMessage)
+ {
+ TMMFAudioPolicyPrioritySettingsPckg settingsPckg;
+ MmfMessageUtil::ReadL(aMessage, 0, settingsPckg);
+
+ iAudioPolicyRequest->SetPriority(settingsPckg().iPriority);
+ iAudioPolicyRequest->SetPref(settingsPckg().iPref);
+ iAudioPolicyRequest->SetState(settingsPckg().iState);
+
+ iAudioPolicyRequest->SetCapabilities(settingsPckg().iCapabilities);
+
+ // Set session Id in Request
+ iAudioPolicyRequest->SetPolicySessionId(iPolicySessionId);
+ iAudioPolicy->MakeRequest(iAudioPolicyRequest);
+ }
+
+TBool CMMFAudioPolicySession::UpdateStateL(const RMmfIpcMessage& aMessage)
+ {
+ TMMFAudioPolicyPrioritySettingsPckg settingsPckg;
+ MmfMessageUtil::ReadL(aMessage, 0, settingsPckg);
+
+ iAudioPolicyRequest->SetState(settingsPckg().iState);
+ iAudioPolicy->ModifyEntry(iPolicySessionId, iAudioPolicyRequest);
+ return ETrue;
+ }
+
+void CMMFAudioPolicySession::SendEventToClient(TMMFAudioPolicyEvent& aEvent)
+ {
+ if (iEventReceiver)
+ {
+ iEventReceiver->SendEvent(aEvent);
+ delete iEventReceiver;
+ iEventReceiver=NULL;
+ }
+ else
+ {
+ TMMFAudioPolicyEventHolder* heldEvent = new TMMFAudioPolicyEventHolder(aEvent);
+ iEventsQue.AddLast(*heldEvent);
+ }
+ }
+
+TBool CMMFAudioPolicySession::SetDevSoundInfoL(const RMmfIpcMessage& aMessage)
+ {
+ TMMFDevSoundInfoPckg devSoundInfoPckg;
+ MmfMessageUtil::ReadL(aMessage, 0, devSoundInfoPckg);
+ iDevSoundId = devSoundInfoPckg().iDevSoundId;
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::ReceiveEventsL(const RMmfIpcMessage& aMessage)
+ {
+ if (iEventReceiver)
+ User::Leave(KErrAlreadyExists);
+ iEventReceiver = CMMFAudioPolicyEventReceiver::NewL(aMessage);
+ //send the next cached event (if any) to the client
+ if (!iEventsQue.IsEmpty())
+ {
+ TMMFAudioPolicyEventHolder* heldEvent = iEventsQue.First();
+ iEventReceiver->SendEvent(heldEvent->iEvent);
+ iEventsQue.Remove(*heldEvent);
+ delete iEventReceiver;
+ iEventReceiver=NULL;
+ }
+ return EFalse;
+ }
+
+TBool CMMFAudioPolicySession::CancelReceiveEvents()
+ {
+ delete iEventReceiver;
+ iEventReceiver = NULL;
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::GetPlayFormatsSupportedL(const RMmfIpcMessage& aMessage)
+ {
+ RMdaDevSound::TSoundFormatsSupportedBuf aPlayFormatsSupported;
+ aPlayFormatsSupported = iAudioPolicy->MdaHwInfo()->GetPlayFormatsSupported();
+ MmfMessageUtil::WriteL(aMessage, 0, aPlayFormatsSupported);
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::GetRecordFormatsSupportedL(const RMmfIpcMessage& aMessage)
+ {
+ RMdaDevSound::TSoundFormatsSupportedBuf aRecordFormatsSupported;
+ aRecordFormatsSupported = iAudioPolicy->MdaHwInfo()->GetRecordFormatsSupported();
+ MmfMessageUtil::WriteL(aMessage, 0, aRecordFormatsSupported);
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::GetPlayFormatL(const RMmfIpcMessage& aMessage)
+ {
+ RMdaDevSound::TCurrentSoundFormatBuf aPlayFormat;
+ aPlayFormat = iAudioPolicy->MdaHwInfo()->GetPlayFormat();
+ MmfMessageUtil::WriteL(aMessage, 0, aPlayFormat);
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::GetRecordFormatL(const RMmfIpcMessage& aMessage)
+ {
+ RMdaDevSound::TCurrentSoundFormatBuf aRecordFormat;
+ aRecordFormat = iAudioPolicy->MdaHwInfo()->GetRecordFormat();
+ MmfMessageUtil::WriteL(aMessage, 0, aRecordFormat);
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::LaunchRequest()
+ {
+ iAudioPolicy->LaunchRequest();
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::RequestResourceNotificationL(const RMmfIpcMessage& aMessage)
+ {
+ TMMFAudioPolicyResourceNotificationSettingsPckg notificationPckg;
+ MmfMessageUtil::ReadL(aMessage, 0, notificationPckg);
+ iAudioPolicyRequest->SetNotificationEvent(notificationPckg().iNotificationUid);
+ iAudioPolicy->SetNotification(iPolicySessionId,notificationPckg().iNotificationUid);
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::CancelRequestResourceNotificationL(const RMmfIpcMessage& aMessage)
+ {
+ if(iServer->IsTimerActive() == EFalse)
+ {
+ iServer->StartNotificationTimer();
+ }
+ TMMFAudioPolicyResourceNotificationSettingsPckg notificationPckg;
+ MmfMessageUtil::ReadL(aMessage, 0, notificationPckg);
+ iAudioPolicyRequest->ResetNotificationEvent(notificationPckg().iNotificationUid);
+ iAudioPolicy->SetNotification(iPolicySessionId,KNullUid);
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::StopNotificationL(const RMmfIpcMessage& /*aMessage*/)
+ {
+ iServer->StopNotificationTimer();
+ return ETrue;
+ }
+
+TBool CMMFAudioPolicySession::GetResourceNotificationEventL(const RMmfIpcMessage& aMessage)
+ {
+ TMMFAudioPolicyResourceNotificationSettingsPckg notificationPckg;
+ notificationPckg().iNotificationUid = iAudioPolicyRequest->NotificationEvent();
+ MmfMessageUtil::WriteL(aMessage, 0, notificationPckg);
+ return ETrue;
+ }
+
+CMMFAudioPolicyEventReceiver* CMMFAudioPolicyEventReceiver::NewL(const RMmfIpcMessage& aMessage)
+ {
+ return new(ELeave) CMMFAudioPolicyEventReceiver(aMessage);
+ }
+
+CMMFAudioPolicyEventReceiver::~CMMFAudioPolicyEventReceiver()
+ {
+ if (iNeedToCompleteMessage)
+ iMessage.Complete(KErrDied);
+ }
+
+void CMMFAudioPolicyEventReceiver::SendEvent(const TMMFAudioPolicyEvent& aEvent)
+ {
+ TMMFAudioPolicyEventPckg eventpckg(aEvent);
+ TInt err = MmfMessageUtil::Write(iMessage, 0, eventpckg);
+ iMessage.Complete(err);
+ iNeedToCompleteMessage = EFalse;
+ }
+
+void CMMFAudioPolicyEventReceiver::SendEvent(const TMMFEvent& aEvent)
+ {
+ TMMFEventPckg eventpckg(aEvent);
+ TInt err = MmfMessageUtil::Write(iMessage, 0, eventpckg);
+ iMessage.Complete(err);
+ iNeedToCompleteMessage = EFalse;
+ }
+
+CMMFAudioPolicyEventReceiver::CMMFAudioPolicyEventReceiver(const RMmfIpcMessage& aMessage) :
+ iMessage(aMessage), iNeedToCompleteMessage(ETrue)
+ {
+ }