sl@0: // Copyright (c) 2000-2009 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: sl@0: // sl@0: sl@0: #include sl@0: #include "MmfBtAudioPolicyServer.h" sl@0: #include "MmfBtAudioPolicyStart.h" sl@0: #include "MmfBtAudioPolicySession.h" sl@0: sl@0: const TInt KTimeOutInterval = 1000000; sl@0: sl@0: CMMFAudioPolicyServer* CMMFAudioPolicyServer::NewL() sl@0: { sl@0: CMMFAudioPolicyServer* s = new(ELeave) CMMFAudioPolicyServer(); sl@0: CleanupStack::PushL(s); sl@0: s->ConstructL(); sl@0: CleanupStack::Pop(); sl@0: return s; sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::CMMFAudioPolicyServer() : sl@0: CMmfIpcServer(EPriorityStandard) sl@0: { sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::ConstructL() sl@0: { sl@0: // Create AudioPolicy singleton sl@0: iAudioPolicy = CAudioPolicy::NewL(this); sl@0: TCallBack callBack(SendNotification,this); sl@0: iNotificationTimer = CNotificationTimer::NewL(callBack); sl@0: // Call base class to Start server sl@0: StartL(KNullDesC); sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::~CMMFAudioPolicyServer() sl@0: { sl@0: if(iNotificationTimer != NULL) sl@0: { sl@0: StopNotificationTimer(); sl@0: } sl@0: delete iAudioPolicy; sl@0: delete iNotificationTimer; sl@0: } sl@0: sl@0: CMmfIpcSession* CMMFAudioPolicyServer::NewSessionL(const TVersion& aVersion) const sl@0: { sl@0: TVersion v(KMMFAudioPolicyVersion,KMMFAudioPolicyMinorVersionNumber,KMMFAudioPolicyBuildVersionNumber); sl@0: if(!User::QueryVersionSupported(v, aVersion)) sl@0: User::Leave(KErrNotSupported); sl@0: sl@0: CMMFAudioPolicySession* aAudioPolicySession = CMMFAudioPolicySession::NewL(); sl@0: return aAudioPolicySession; sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::IncrementSessionId() sl@0: { sl@0: iPolicySessionId++; sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::SendEventToClient(TInt aSessionToAlert, TInt /*aSessionToBeLaunched*/, TMMFAudioPolicyEvent& aEvent) sl@0: { sl@0: TMMFAudioPolicyEvent eventForClient; sl@0: eventForClient.iEventType = aEvent.iEventType; sl@0: eventForClient.iErrorCode = aEvent.iErrorCode; sl@0: eventForClient.iState = aEvent.iState; sl@0: sl@0: // For the session requested, send event to client sl@0: iSessionIter.SetToFirst(); sl@0: CMMFAudioPolicySession* session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++); sl@0: while (session != NULL) sl@0: { sl@0: if (session->PolicySessionId() == aSessionToAlert) sl@0: { sl@0: session->SendEventToClient(eventForClient); sl@0: break; // Finished sl@0: } sl@0: session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++); sl@0: } sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::LaunchRequest(TInt aSessionId, TMMFAudioPolicyEvent& aEvent) sl@0: { sl@0: iSessionIter.SetToFirst(); sl@0: CMMFAudioPolicySession* session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++); sl@0: while (session != NULL) sl@0: { sl@0: if (session->PolicySessionId() == aSessionId) sl@0: { sl@0: session->SendEventToClient(aEvent); sl@0: break; // Finished sl@0: } sl@0: session = STATIC_CAST(CMMFAudioPolicySession*, iSessionIter++); sl@0: } sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::IncrementSessionCount() sl@0: { sl@0: iPolicySessionCount++; sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::CNotificationTimer *CMMFAudioPolicyServer::CNotificationTimer::NewL(TCallBack aCallBack) sl@0: { sl@0: CNotificationTimer* self = new(ELeave) CNotificationTimer(aCallBack); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: CleanupStack::Pop(); // self sl@0: return self; sl@0: } sl@0: sl@0: CMMFAudioPolicyServer::CNotificationTimer::CNotificationTimer(TCallBack aCallBack) sl@0: : CTimer(EPriorityHigh),iCallBack(aCallBack) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::CNotificationTimer::RunL() sl@0: { sl@0: iCallBack.CallBack(); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::DecrementSessionCount() sl@0: { sl@0: iPolicySessionCount--; sl@0: } sl@0: sl@0: TInt CMMFAudioPolicyServer::PolicySessionCount() sl@0: { sl@0: return iPolicySessionCount; sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::StartNotificationTimer() sl@0: { sl@0: iNotificationTimer->After(KTimeOutInterval); sl@0: } sl@0: sl@0: void CMMFAudioPolicyServer::StopNotificationTimer() sl@0: { sl@0: iNotificationTimer->Cancel(); sl@0: } sl@0: sl@0: TInt CMMFAudioPolicyServer::SendNotification(TAny* aAny) sl@0: { sl@0: CMMFAudioPolicyServer* policyServer = reinterpret_cast(aAny); sl@0: policyServer->iAudioPolicy->DoSendNotification(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: TBool CMMFAudioPolicyServer::IsTimerActive() const sl@0: { sl@0: return iNotificationTimer->IsActive(); sl@0: }