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