os/mm/mmlibs/mmfw/SecureDRM/src/Server/MmfDrmPluginServer.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
#include <e32math.h>
sl@0
    17
#include <mmf/common/mmfcontrollerframework.h>
sl@0
    18
#include "MmfDrmPluginServer.h"
sl@0
    19
#include "MmfDrmPluginServerStart.h"
sl@0
    20
#include "MmfDrmPluginServerSession.h"
sl@0
    21
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
sl@0
    22
#include <mmf/common/mmfcontrollerframeworkclasses.h>
sl@0
    23
#endif
sl@0
    24
sl@0
    25
CMMFDRMPluginServer* CMMFDRMPluginServer::NewL()
sl@0
    26
	{
sl@0
    27
	CMMFDRMPluginServer* s = new(ELeave) CMMFDRMPluginServer();
sl@0
    28
	CleanupStack::PushL(s);
sl@0
    29
	s->ConstructL();
sl@0
    30
	CleanupStack::Pop();
sl@0
    31
	return s;
sl@0
    32
	}
sl@0
    33
sl@0
    34
CMMFDRMPluginServer::CMMFDRMPluginServer() :
sl@0
    35
	CMmfIpcServer(EPriorityStandard)
sl@0
    36
	{
sl@0
    37
	}
sl@0
    38
sl@0
    39
void CMMFDRMPluginServer::ConstructL()
sl@0
    40
	{
sl@0
    41
	iDelayServerShutDown = CDelayServerShutDown::NewL();
sl@0
    42
	// Call base class to Start server
sl@0
    43
	StartL(KDrmPluginServerName);
sl@0
    44
	}
sl@0
    45
sl@0
    46
CMMFDRMPluginServer::~CMMFDRMPluginServer()
sl@0
    47
	{
sl@0
    48
	iControllerServList.ResetAndDestroy();
sl@0
    49
	iControllerServList.Close();
sl@0
    50
	delete iDelayServerShutDown;
sl@0
    51
	}
sl@0
    52
sl@0
    53
CMmfIpcSession* CMMFDRMPluginServer::NewSessionL(const TVersion& aVersion) const
sl@0
    54
	{
sl@0
    55
	TVersion v(KMMFDRMPluginServerVersion,
sl@0
    56
				KMMFDRMPluginServerMinorVersionNumber,
sl@0
    57
				KMMFDRMPluginServerBuildVersionNumber);
sl@0
    58
	if(!User::QueryVersionSupported(v, aVersion))
sl@0
    59
		{
sl@0
    60
		User::Leave(KErrNotSupported);
sl@0
    61
		}
sl@0
    62
		
sl@0
    63
	for(TInt i = 0; i < iControllerServList.Count(); i++)
sl@0
    64
		{
sl@0
    65
		CStartAndMonitorControllerThread* controllerMonThread 
sl@0
    66
			= iControllerServList[i];
sl@0
    67
		if(!controllerMonThread->IsActive())
sl@0
    68
			{
sl@0
    69
			iControllerServList.Remove(i);
sl@0
    70
			delete controllerMonThread;
sl@0
    71
			}
sl@0
    72
		}
sl@0
    73
	iControllerServList.Compress();
sl@0
    74
	
sl@0
    75
	CMMFDRMPluginServerSession* session = CMMFDRMPluginServerSession::NewL();
sl@0
    76
	return session;
sl@0
    77
	}
sl@0
    78
sl@0
    79
void CMMFDRMPluginServer::IncrementSessionId()
sl@0
    80
	{
sl@0
    81
	iSessionCount++;
sl@0
    82
	}
sl@0
    83
sl@0
    84
void CMMFDRMPluginServer::DecrementSessionId()
sl@0
    85
	{
sl@0
    86
	iSessionCount--;
sl@0
    87
	if(iSessionCount == 0 && iControllerCount == 0)
sl@0
    88
		{
sl@0
    89
		// Guarantee that server will be closed, after a period of time, even
sl@0
    90
		// a session has been created without a controller thread initialized 
sl@0
    91
		if(!iDelayServerShutDown->IsActive())
sl@0
    92
			{
sl@0
    93
			// If shut down timer has been started previously, that setup has the piority
sl@0
    94
			iDelayServerShutDown->SetDelay(TTimeIntervalMicroSeconds32(iServerTimeout));
sl@0
    95
			}
sl@0
    96
		}
sl@0
    97
	}
sl@0
    98
sl@0
    99
void CMMFDRMPluginServer::IncrementControllerCount()
sl@0
   100
	{
sl@0
   101
	iControllerCount++;
sl@0
   102
	if(iControllerCount)
sl@0
   103
		{
sl@0
   104
		//In the case we started the shutdown due to no more controllers
sl@0
   105
		iDelayServerShutDown->Cancel(); 
sl@0
   106
		}
sl@0
   107
	}
sl@0
   108
sl@0
   109
void CMMFDRMPluginServer::DecrementControllerCount()
sl@0
   110
	{
sl@0
   111
	iControllerCount--;
sl@0
   112
    if (iControllerCount == 0)
sl@0
   113
		{
sl@0
   114
		iDelayServerShutDown->SetDelay(TTimeIntervalMicroSeconds32(iServerTimeout));
sl@0
   115
 		}
sl@0
   116
	}
sl@0
   117
	
sl@0
   118
TInt CMMFDRMPluginServer::StartControllerServer(const RThread& aClientThread, TUint aMaxHeapSize, TBool aUseSharedHeap,
sl@0
   119
											RMMFControllerServerProxy& aControllerSessionHandle, TThreadId& aControllerTID, TUint aStackSize) const
sl@0
   120
	{
sl@0
   121
	CStartAndMonitorControllerThread* monitor = NULL;
sl@0
   122
sl@0
   123
	TRAPD(err, monitor = 
sl@0
   124
		CStartAndMonitorControllerThread::NewL(const_cast<CMMFDRMPluginServer*>(this)));
sl@0
   125
	if(err != KErrNone)
sl@0
   126
		{
sl@0
   127
		delete monitor;
sl@0
   128
		return err;
sl@0
   129
		}
sl@0
   130
sl@0
   131
	err = iControllerServList.Append(monitor);
sl@0
   132
	if(err != KErrNone)
sl@0
   133
		{
sl@0
   134
		delete monitor;
sl@0
   135
		return err;
sl@0
   136
		}
sl@0
   137
	
sl@0
   138
	return monitor->StartControllerServer(aClientThread, aMaxHeapSize, aUseSharedHeap, 
sl@0
   139
										aControllerSessionHandle, aControllerTID, aStackSize);
sl@0
   140
	}
sl@0
   141
sl@0
   142
void CMMFDRMPluginServer::PanicControllerThread(TThreadId aTid, const TDesC& aCategory,TInt aReason)
sl@0
   143
	{
sl@0
   144
	for(TInt i = 0; i < iControllerServList.Count(); i++)
sl@0
   145
		{
sl@0
   146
		if(iControllerServList[i]->Thread().Id() == aTid)
sl@0
   147
			{
sl@0
   148
			iControllerServList[i]->Thread().Panic(aCategory, aReason);
sl@0
   149
			return;
sl@0
   150
			}
sl@0
   151
		}
sl@0
   152
	}
sl@0
   153
sl@0
   154
void CMMFDRMPluginServer::KillControllerThread(TThreadId aTid, TInt aReason)
sl@0
   155
	{
sl@0
   156
	for(TInt i = 0; i < iControllerServList.Count(); i++)
sl@0
   157
		{
sl@0
   158
		if(iControllerServList[i]->Thread().Id() == aTid)
sl@0
   159
			{
sl@0
   160
			iControllerServList[i]->Thread().Kill(aReason);
sl@0
   161
			return;
sl@0
   162
			}
sl@0
   163
		}
sl@0
   164
	}
sl@0
   165
sl@0
   166
TInt CMMFDRMPluginServer::SetThreadPriority(TThreadId aTid, TThreadPriority aPriority)
sl@0
   167
	{
sl@0
   168
	TBool threadFound = EFalse;
sl@0
   169
	for(TInt i = 0; i < iControllerServList.Count(); i++)
sl@0
   170
		{
sl@0
   171
		const RThread& controllerThread = iControllerServList[i]->Thread();
sl@0
   172
		if (controllerThread.Id() == aTid)
sl@0
   173
			{
sl@0
   174
			if (controllerThread.Priority() != aPriority)
sl@0
   175
				{
sl@0
   176
				controllerThread.Suspend();
sl@0
   177
				controllerThread.SetPriority(aPriority);
sl@0
   178
				controllerThread.Resume();
sl@0
   179
				}
sl@0
   180
			threadFound = ETrue;
sl@0
   181
			break;
sl@0
   182
			}
sl@0
   183
		}
sl@0
   184
	return threadFound? KErrNone: KErrNotFound;
sl@0
   185
	}
sl@0
   186
sl@0
   187
CMMFDRMPluginServer::CDelayServerShutDown* CMMFDRMPluginServer::CDelayServerShutDown::NewL()
sl@0
   188
	{
sl@0
   189
	CDelayServerShutDown* self = new(ELeave) CDelayServerShutDown;
sl@0
   190
	CleanupStack::PushL(self);
sl@0
   191
	self->ConstructL();
sl@0
   192
	CleanupStack::Pop();
sl@0
   193
	return self;
sl@0
   194
	}
sl@0
   195
sl@0
   196
CMMFDRMPluginServer::CDelayServerShutDown::CDelayServerShutDown() : CActive(0)
sl@0
   197
	{
sl@0
   198
	}
sl@0
   199
        
sl@0
   200
void CMMFDRMPluginServer::CDelayServerShutDown::ConstructL()
sl@0
   201
	{
sl@0
   202
	User::LeaveIfError(iShutDownTimer.CreateLocal());
sl@0
   203
	CActiveScheduler::Add(this);
sl@0
   204
	}
sl@0
   205
sl@0
   206
CMMFDRMPluginServer::CDelayServerShutDown::~CDelayServerShutDown()
sl@0
   207
	{
sl@0
   208
	Cancel();
sl@0
   209
	iShutDownTimer.Close();
sl@0
   210
	}
sl@0
   211
sl@0
   212
void CMMFDRMPluginServer::CDelayServerShutDown::SetDelay(TTimeIntervalMicroSeconds32 aDelay)
sl@0
   213
	{
sl@0
   214
	__ASSERT_ALWAYS(!IsActive(), User::Panic(_L("CMMFDRMPluginServer"), 1));
sl@0
   215
	iShutDownTimer.After(iStatus, aDelay);
sl@0
   216
	SetActive();
sl@0
   217
	}
sl@0
   218
sl@0
   219
void CMMFDRMPluginServer::CDelayServerShutDown::RunL()
sl@0
   220
	{
sl@0
   221
	CActiveScheduler::Stop();
sl@0
   222
	}
sl@0
   223
sl@0
   224
sl@0
   225
void CMMFDRMPluginServer::CDelayServerShutDown::DoCancel()
sl@0
   226
	{
sl@0
   227
	iShutDownTimer.Cancel();
sl@0
   228
	}
sl@0
   229
sl@0
   230
CStartAndMonitorControllerThread* CStartAndMonitorControllerThread::NewL(CMMFDRMPluginServer* aPluginServer)
sl@0
   231
	{
sl@0
   232
	CStartAndMonitorControllerThread* self = new(ELeave) CStartAndMonitorControllerThread(aPluginServer);
sl@0
   233
	CleanupStack::PushL(self);
sl@0
   234
	self->ConstructL();
sl@0
   235
	CleanupStack::Pop();
sl@0
   236
	return self;
sl@0
   237
	}
sl@0
   238
sl@0
   239
void CStartAndMonitorControllerThread::ConstructL()
sl@0
   240
	{
sl@0
   241
	CActiveScheduler::Add(this);
sl@0
   242
	}
sl@0
   243
	
sl@0
   244
TInt CStartAndMonitorControllerThread::StartControllerServer(const RThread& /*aClientThread*/, TUint aMaxHeapSize, TBool aUseSharedHeap,
sl@0
   245
													RMMFControllerServerProxy& aControllerSessionHandle, TThreadId& aControllerTID,TUint aStackSize)
sl@0
   246
	{
sl@0
   247
	Cancel();
sl@0
   248
	TInt err = KErrNone;
sl@0
   249
sl@0
   250
	RServer2 controllerServer;	
sl@0
   251
	TControllerProxyServerParams params;
sl@0
   252
	params.iServer = &controllerServer;
sl@0
   253
	params.iUsingSharedHeap = aUseSharedHeap;
sl@0
   254
	
sl@0
   255
	TName name;
sl@0
   256
	name.Append(KMMFControllerProxyServerName);
sl@0
   257
	
sl@0
   258
	// Threads create own heap (default behaviour)
sl@0
   259
	if(aMaxHeapSize < static_cast<TUint>(KMinHeapSize))
sl@0
   260
		{
sl@0
   261
		aMaxHeapSize = KMinHeapSize; //else raises a USER 111 panic
sl@0
   262
		}
sl@0
   263
	else if(aMaxHeapSize >  static_cast<TUint>(KMMFControllerProxyMaxHeapSize))
sl@0
   264
		{
sl@0
   265
		aMaxHeapSize = KMMFControllerProxyMaxHeapSize;
sl@0
   266
		}
sl@0
   267
	
sl@0
   268
	err = iServerThread.Create(name, &CMMFControllerProxyServer::StartThread,
sl@0
   269
		aStackSize, KMinHeapSize, aMaxHeapSize, 
sl@0
   270
		&params, EOwnerThread);
sl@0
   271
	if (err)
sl@0
   272
		{
sl@0
   273
		return err;
sl@0
   274
		}
sl@0
   275
		
sl@0
   276
	// Synchronise with the server
sl@0
   277
	TRequestStatus reqStatus;
sl@0
   278
	iServerThread.Rendezvous(reqStatus);
sl@0
   279
	
sl@0
   280
	if (reqStatus!=KRequestPending)
sl@0
   281
		{
sl@0
   282
		iServerThread.Kill(0);
sl@0
   283
		}
sl@0
   284
	else
sl@0
   285
		{
sl@0
   286
		iServerThread.SetPriority(EPriorityNormal);
sl@0
   287
		iServerThread.Resume();
sl@0
   288
		// Server will call the reciprocal static synchronise call	
sl@0
   289
		}
sl@0
   290
sl@0
   291
	User::WaitForRequest(reqStatus); // wait for start or death
sl@0
   292
	if(reqStatus.Int() != KErrNone)
sl@0
   293
		{
sl@0
   294
		iServerThread.Close();
sl@0
   295
		controllerServer.Close();
sl@0
   296
		return reqStatus.Int();
sl@0
   297
		}
sl@0
   298
	
sl@0
   299
	err = aControllerSessionHandle.Open(controllerServer);
sl@0
   300
	if(err != KErrNone)
sl@0
   301
		{
sl@0
   302
		iServerThread.Close();
sl@0
   303
		controllerServer.Close();
sl@0
   304
		return err;
sl@0
   305
		}
sl@0
   306
	
sl@0
   307
	iStatus = KRequestPending;
sl@0
   308
	iServerThread.Logon(iStatus);
sl@0
   309
	if (iStatus != KRequestPending)
sl@0
   310
		{
sl@0
   311
		// Failed to logon
sl@0
   312
		aControllerSessionHandle.Close();
sl@0
   313
		iServerThread.Close();
sl@0
   314
		controllerServer.Close();
sl@0
   315
		return iStatus.Int();
sl@0
   316
		}
sl@0
   317
	else
sl@0
   318
		{
sl@0
   319
		SetActive();
sl@0
   320
		}
sl@0
   321
		
sl@0
   322
	aControllerSessionHandle.ShareProtected();
sl@0
   323
	aControllerTID = iServerThread.Id();
sl@0
   324
	iDrmPluginServer->IncrementControllerCount();
sl@0
   325
	return KErrNone;
sl@0
   326
	}
sl@0
   327
sl@0
   328
sl@0
   329
CStartAndMonitorControllerThread::CStartAndMonitorControllerThread(CMMFDRMPluginServer* aPluginServer)
sl@0
   330
	: CActive(EPriorityStandard)
sl@0
   331
	{
sl@0
   332
	iDrmPluginServer = aPluginServer;
sl@0
   333
	}
sl@0
   334
sl@0
   335
CStartAndMonitorControllerThread::~CStartAndMonitorControllerThread()
sl@0
   336
	{
sl@0
   337
	Cancel();
sl@0
   338
	}
sl@0
   339
    
sl@0
   340
void CStartAndMonitorControllerThread::RunL()
sl@0
   341
	{
sl@0
   342
	iServerThread.Close();
sl@0
   343
	iDrmPluginServer->DecrementControllerCount();
sl@0
   344
	}
sl@0
   345
sl@0
   346
void CStartAndMonitorControllerThread::DoCancel()
sl@0
   347
	{
sl@0
   348
	iServerThread.LogonCancel(iStatus);
sl@0
   349
	iServerThread.Kill(0);
sl@0
   350
	iServerThread.Close();
sl@0
   351
	iDrmPluginServer->DecrementControllerCount();
sl@0
   352
	}
sl@0
   353
sl@0
   354
TInt RMMFControllerServerProxy::Open(RServer2& aControllerServerHandle)
sl@0
   355
	{
sl@0
   356
	TInt err = CreateSession(aControllerServerHandle, KMMFControllerProxyVersion, 
sl@0
   357
							-1, EIpcSession_GlobalSharable);
sl@0
   358
	return err;
sl@0
   359
	}