os/mm/devsound/sounddevbt/PlatSec/src/Server/AudioServer/MmfBtDevSoundServer.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
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".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 //
    15 
    16 #include <e32math.h>
    17 #include "MmfBtDevSoundServer.h"
    18 #include "MmfBtDevSoundServerStart.h"
    19 #include "MmfBtDevSoundSession.h"
    20 
    21 const TInt KDevSoundShutDownDelay = 0; //0 sec
    22 
    23 EXPORT_C CMMFDevSoundServer* CMMFDevSoundServer::NewL(CMMFAudioServer* aAudioServer, TProcessId& aClientPID)
    24 	{
    25 	CMMFDevSoundServer* s = new(ELeave) CMMFDevSoundServer(aAudioServer, aClientPID);
    26 	CleanupStack::PushL(s);
    27 	s->ConstructL();
    28 	CleanupStack::Pop();
    29 	return s;
    30 	}
    31 
    32 CMMFDevSoundServer::CMMFDevSoundServer(CMMFAudioServer* aAudioServer, TProcessId& aClientPID) :
    33 	CMmfIpcServer(EPriorityStandard), iClientPID(aClientPID)
    34 	{
    35 	iAudioServer = aAudioServer;
    36 	}
    37 
    38 void CMMFDevSoundServer::ConstructL()
    39 	{
    40 	RProcess client;
    41 	User::LeaveIfError(client.Open(iClientPID));
    42 	iClientHasCaps = client.HasCapability(ECapabilityMultimediaDD, KSuppressPlatSecDiagnostic);
    43 	client.Close();
    44 
    45 	iDelayDevSoundShutDown = CDelayDevSoundShutDown::NewL();
    46 
    47 	// Call base class to Start server
    48 	TName name(RThread().Name());
    49 	StartL(name);
    50 	}
    51 
    52 CMMFDevSoundServer::~CMMFDevSoundServer()
    53 	{
    54 	if (iDelayDevSoundShutDown)
    55 		{
    56 		iDelayDevSoundShutDown->Cancel();
    57 		delete iDelayDevSoundShutDown;
    58 		}
    59 	}
    60 
    61 CMmfIpcSession* CMMFDevSoundServer::NewSessionL(const TVersion& aVersion) const
    62 	{
    63 	RMessage2 message(Message());
    64 	RThread clientThread;
    65 	message.ClientL(clientThread);
    66 	RProcess clientProcess;
    67 	User::LeaveIfError(clientThread.Process(clientProcess));
    68 
    69 	TProcessId clientProcessID(clientProcess.Id());
    70 	clientThread.Close();
    71 	clientProcess.Close();
    72 
    73 	if(iClientPID != clientProcessID)
    74 		{
    75 		User::Leave(KErrAccessDenied);
    76 		}
    77 
    78 
    79 	TVersion v(KMMFDevSoundServerVersion,KMMFDevSoundServerMinorVersionNumber,KMMFDevSoundServerBuildVersionNumber);
    80 	if(!User::QueryVersionSupported(v, aVersion))
    81 		User::Leave(KErrNotSupported);
    82 	
    83 	CMMFDevSoundSession* devSoundSession = CMMFDevSoundSession::NewL(iAudioServer->PolicyServerHandle());
    84 	return devSoundSession;
    85 	}
    86 
    87 void CMMFDevSoundServer::IncrementSessionId()
    88 	{
    89 	iDevSoundSessionId++;
    90 	if(iDevSoundSessionId)
    91 		iDelayDevSoundShutDown->Cancel();
    92 
    93 	}
    94 
    95 void CMMFDevSoundServer::DecrementSessionId()
    96 	{
    97 	iDevSoundSessionId--;
    98     if ( iDevSoundSessionId == 0 )
    99 		{
   100 		iDelayDevSoundShutDown->SetDelay(TTimeIntervalMicroSeconds32(KDevSoundShutDownDelay));
   101  		}
   102 	}
   103 
   104 void CMMFDevSoundServer::SendEventToClient(TInt aSessionToAlert, TInt /*aSessionToBeLaunched*/)
   105 	{
   106 	// For the session requested, send event to client
   107 	iSessionIter.SetToFirst();
   108 	CMMFDevSoundSession* session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
   109 	while (session != NULL)
   110 		{
   111 		if (session->DevSoundSessionId() == aSessionToAlert)
   112 			{
   113 			break;  // Finished
   114 			}
   115 		session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
   116 		}
   117 	}
   118 
   119 void CMMFDevSoundServer::LaunchRequest(TInt aSessionId)
   120 	{
   121 	iSessionIter.SetToFirst();
   122 	CMMFDevSoundSession* session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
   123 	while (session != NULL)
   124 		{
   125 		if (session->DevSoundSessionId() == aSessionId)
   126 			{
   127 			break;  // Finished
   128 			}
   129 		session = static_cast<CMMFDevSoundSession*>(iSessionIter++);
   130 		}
   131 	}
   132 
   133 TBool CMMFDevSoundServer::CheckClientCapabilities()
   134 	{
   135 	return iClientHasCaps;
   136 	}
   137 
   138 void CMMFDevSoundServer::SetClientCapabilitiesL(TThreadId aTid)
   139 	{
   140 	RThread clientThread;
   141 	User::LeaveIfError(clientThread.Open(aTid));
   142 	CleanupClosePushL(clientThread);
   143 	
   144 	RProcess clientProcess;
   145 	User::LeaveIfError(clientThread.Process(clientProcess));
   146 	CleanupClosePushL(clientProcess);
   147 	
   148 	iClientHasCaps = clientProcess.HasCapability(ECapabilityMultimediaDD, KSuppressPlatSecDiagnostic);
   149 	
   150 	CleanupStack::PopAndDestroy(2, &clientThread);	// clientProcess, clientThread
   151 	}
   152 
   153 CMMFDevSoundServer::CDelayDevSoundShutDown* CMMFDevSoundServer::CDelayDevSoundShutDown::NewL()
   154 	{
   155 	CDelayDevSoundShutDown* self = new(ELeave) CDelayDevSoundShutDown;
   156 	CleanupStack::PushL(self);
   157 	self->ConstructL();
   158 	CleanupStack::Pop();
   159 	return self;
   160 	}
   161 
   162 CMMFDevSoundServer::CDelayDevSoundShutDown::CDelayDevSoundShutDown() : CActive(0)
   163 	{
   164 	}
   165         
   166 void CMMFDevSoundServer::CDelayDevSoundShutDown::ConstructL()
   167 	{
   168 	User::LeaveIfError(iTimer.CreateLocal());
   169 	CActiveScheduler::Add(this);
   170 	}
   171 
   172 CMMFDevSoundServer::CDelayDevSoundShutDown::~CDelayDevSoundShutDown()
   173 	{
   174 	Cancel();
   175 	iTimer.Close();
   176 	}
   177 
   178 
   179 void CMMFDevSoundServer::CDelayDevSoundShutDown::SetDelay(TTimeIntervalMicroSeconds32 aDelay)
   180 	{
   181 	__ASSERT_ALWAYS(!IsActive(),
   182 	User::Panic(_L("CDelayedShutDown"), 1));
   183 	iTimer.After(iStatus, aDelay);
   184 	SetActive();
   185 	}
   186 
   187 void CMMFDevSoundServer::CDelayDevSoundShutDown::RunL()
   188 	{
   189 	CActiveScheduler::Stop();
   190 	}
   191 
   192 void CMMFDevSoundServer::CDelayDevSoundShutDown::DoCancel()
   193 	{
   194 	iTimer.Cancel();
   195 	}
   196   
   197 
   198         
   199