Update contrib.
1 // Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
17 #include "MmfBtDevSoundServer.h"
18 #include "MmfBtDevSoundServerStart.h"
19 #include "MmfBtDevSoundSession.h"
21 const TInt KDevSoundShutDownDelay = 0; //0 sec
23 EXPORT_C CMMFDevSoundServer* CMMFDevSoundServer::NewL(CMMFAudioServer* aAudioServer, TProcessId& aClientPID)
25 CMMFDevSoundServer* s = new(ELeave) CMMFDevSoundServer(aAudioServer, aClientPID);
26 CleanupStack::PushL(s);
32 CMMFDevSoundServer::CMMFDevSoundServer(CMMFAudioServer* aAudioServer, TProcessId& aClientPID) :
33 CMmfIpcServer(EPriorityStandard), iClientPID(aClientPID)
35 iAudioServer = aAudioServer;
38 void CMMFDevSoundServer::ConstructL()
41 User::LeaveIfError(client.Open(iClientPID));
42 iClientHasCaps = client.HasCapability(ECapabilityMultimediaDD, KSuppressPlatSecDiagnostic);
45 iDelayDevSoundShutDown = CDelayDevSoundShutDown::NewL();
47 // Call base class to Start server
48 TName name(RThread().Name());
52 CMMFDevSoundServer::~CMMFDevSoundServer()
54 if (iDelayDevSoundShutDown)
56 iDelayDevSoundShutDown->Cancel();
57 delete iDelayDevSoundShutDown;
61 CMmfIpcSession* CMMFDevSoundServer::NewSessionL(const TVersion& aVersion) const
63 RMessage2 message(Message());
65 message.ClientL(clientThread);
66 RProcess clientProcess;
67 User::LeaveIfError(clientThread.Process(clientProcess));
69 TProcessId clientProcessID(clientProcess.Id());
71 clientProcess.Close();
73 if(iClientPID != clientProcessID)
75 User::Leave(KErrAccessDenied);
79 TVersion v(KMMFDevSoundServerVersion,KMMFDevSoundServerMinorVersionNumber,KMMFDevSoundServerBuildVersionNumber);
80 if(!User::QueryVersionSupported(v, aVersion))
81 User::Leave(KErrNotSupported);
83 CMMFDevSoundSession* devSoundSession = CMMFDevSoundSession::NewL(iAudioServer->PolicyServerHandle());
84 return devSoundSession;
87 void CMMFDevSoundServer::IncrementSessionId()
90 if(iDevSoundSessionId)
91 iDelayDevSoundShutDown->Cancel();
95 void CMMFDevSoundServer::DecrementSessionId()
98 if ( iDevSoundSessionId == 0 )
100 iDelayDevSoundShutDown->SetDelay(TTimeIntervalMicroSeconds32(KDevSoundShutDownDelay));
104 void CMMFDevSoundServer::SendEventToClient(TInt aSessionToAlert, TInt /*aSessionToBeLaunched*/)
106 // For the session requested, send event to client
107 iSessionIter.SetToFirst();
108 CMMFDevSoundSession* session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
109 while (session != NULL)
111 if (session->DevSoundSessionId() == aSessionToAlert)
115 session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
119 void CMMFDevSoundServer::LaunchRequest(TInt aSessionId)
121 iSessionIter.SetToFirst();
122 CMMFDevSoundSession* session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
123 while (session != NULL)
125 if (session->DevSoundSessionId() == aSessionId)
129 session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
133 TBool CMMFDevSoundServer::CheckClientCapabilities()
135 return iClientHasCaps;
138 void CMMFDevSoundServer::SetClientCapabilitiesL(TThreadId aTid)
140 RThread clientThread;
141 User::LeaveIfError(clientThread.Open(aTid));
142 CleanupClosePushL(clientThread);
144 RProcess clientProcess;
145 User::LeaveIfError(clientThread.Process(clientProcess));
146 CleanupClosePushL(clientProcess);
148 iClientHasCaps = clientProcess.HasCapability(ECapabilityMultimediaDD, KSuppressPlatSecDiagnostic);
150 CleanupStack::PopAndDestroy(2, &clientThread); // clientProcess, clientThread
153 CMMFDevSoundServer::CDelayDevSoundShutDown* CMMFDevSoundServer::CDelayDevSoundShutDown::NewL()
155 CDelayDevSoundShutDown* self = new(ELeave) CDelayDevSoundShutDown;
156 CleanupStack::PushL(self);
162 CMMFDevSoundServer::CDelayDevSoundShutDown::CDelayDevSoundShutDown() : CActive(0)
166 void CMMFDevSoundServer::CDelayDevSoundShutDown::ConstructL()
168 User::LeaveIfError(iTimer.CreateLocal());
169 CActiveScheduler::Add(this);
172 CMMFDevSoundServer::CDelayDevSoundShutDown::~CDelayDevSoundShutDown()
179 void CMMFDevSoundServer::CDelayDevSoundShutDown::SetDelay(TTimeIntervalMicroSeconds32 aDelay)
181 __ASSERT_ALWAYS(!IsActive(),
182 User::Panic(_L("CDelayedShutDown"), 1));
183 iTimer.After(iStatus, aDelay);
187 void CMMFDevSoundServer::CDelayDevSoundShutDown::RunL()
189 CActiveScheduler::Stop();
192 void CMMFDevSoundServer::CDelayDevSoundShutDown::DoCancel()