os/mm/mmlibs/mmfw/src/ControllerFramework/MMFControllerFramework.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) 2002-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/server/mmfdrmpluginserverproxy.h>
sl@0
    18
#include "mmfcontrollerframework.h"
sl@0
    19
#include "mmfcontroller.h"
sl@0
    20
#include "mmfcontrollerheap.h"
sl@0
    21
#include "mmfcontrollerframeworkpriv.h"
sl@0
    22
#include "mmfcontrollerpatchdata.h"
sl@0
    23
sl@0
    24
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
sl@0
    25
#include <mmf/common/mmfcontrollerextendeddata.h>
sl@0
    26
#include <mmf/common/mmfcustomcommandparsermanager.h>
sl@0
    27
#include <mmf/common/mmfcontrollerframeworkclasses.h>
sl@0
    28
#endif
sl@0
    29
sl@0
    30
// Panic
sl@0
    31
   
sl@0
    32
enum
sl@0
    33
	{
sl@0
    34
	EPanicHeapHalfOpen=1,
sl@0
    35
	EPanicHeapOpenWithoutTls,
sl@0
    36
	EPanicReleaseWithoutRegister,
sl@0
    37
	EPanicBadInvariant
sl@0
    38
	};
sl@0
    39
	
sl@0
    40
#ifdef _DEBUG
sl@0
    41
static void Panic(TInt aReason)
sl@0
    42
	{
sl@0
    43
	_LIT(KControllerFramework, "ControllerFramework");
sl@0
    44
	User::Panic(KControllerFramework, aReason);
sl@0
    45
	}
sl@0
    46
#endif
sl@0
    47
sl@0
    48
EXPORT_C RMMFControllerProxy::RMMFControllerProxy() :
sl@0
    49
	iDestinationPckg(TMMFMessageDestination(KUidInterfaceMMFControllerProxy, KMMFObjectHandleControllerProxy)),
sl@0
    50
	iLogonAO(NULL), iThreadPriority(static_cast<TThreadPriority>(KDefaultMMFControllerThreadPriority)), iFlags(0)
sl@0
    51
	{
sl@0
    52
	iSubThread.Close();//iSubThread is automatically initialised to be a handle to this thread!
sl@0
    53
	}
sl@0
    54
sl@0
    55
TInt RMMFControllerProxy::LoadController(
sl@0
    56
	TUid aControllerUid, 
sl@0
    57
 	const CMMFControllerImplementationInformation& aControllerInfo,
sl@0
    58
 	TBool aUseSharedHeap,
sl@0
    59
 	TBool aNoDRMCap)
sl@0
    60
	{
sl@0
    61
	// First check that we haven't already created the subthread
sl@0
    62
	if (iSubThread.Handle() != 0)
sl@0
    63
		return KErrAlreadyExists;
sl@0
    64
	
sl@0
    65
#ifdef SYMBIAN_FORCE_USE_SHARED_HEAP
sl@0
    66
	aUseSharedHeap = ETrue;
sl@0
    67
#endif
sl@0
    68
sl@0
    69
	//determine what maximum heap size this thread should be created with
sl@0
    70
	TUint maxHeapSize =0;
sl@0
    71
	TInt error = KErrNone;
sl@0
    72
	maxHeapSize = aControllerInfo.HeapSpaceRequired();
sl@0
    73
	TUint stackSize = aControllerInfo.StackSize();
sl@0
    74
	
sl@0
    75
	ASSERT(!iLogonAO);
sl@0
    76
	TRAP(error, iLogonAO = CLogonMonitor::NewL(this));
sl@0
    77
	
sl@0
    78
	if (!error)
sl@0
    79
		{
sl@0
    80
		if (aNoDRMCap && aControllerInfo.SupportsSecureDRMProcessMode())
sl@0
    81
			{
sl@0
    82
			error = DoCreateSessionForNoDRMCapClient(maxHeapSize, aUseSharedHeap, stackSize);
sl@0
    83
			}
sl@0
    84
		else
sl@0
    85
			{
sl@0
    86
			// server2 will be set in this function call
sl@0
    87
			error = DoCreateSubThread(&iLogonAO->Server(), maxHeapSize, aUseSharedHeap, stackSize);
sl@0
    88
		
sl@0
    89
			// Now create a session with the controller proxy server running in the subthread
sl@0
    90
			if (!error)
sl@0
    91
				{
sl@0
    92
				// create a session with iServer2 (local server)
sl@0
    93
				error = CreateSession(iLogonAO->Server(), KMMFControllerProxyVersion);
sl@0
    94
				}
sl@0
    95
			}
sl@0
    96
		}
sl@0
    97
sl@0
    98
	// Finally, tell the controller proxy server to load the relevant plugin
sl@0
    99
	if (!error)
sl@0
   100
		{
sl@0
   101
		TMMFUidPckg uidPckg(aControllerUid);
sl@0
   102
		error = SendSync(iDestinationPckg, 
sl@0
   103
						 EMMFControllerProxyLoadControllerPluginByUid, 
sl@0
   104
						 uidPckg, 
sl@0
   105
						 KNullDesC8);
sl@0
   106
		}
sl@0
   107
sl@0
   108
	// If an error occurred with any of the above, close all the handles
sl@0
   109
	if (error)
sl@0
   110
		Close();
sl@0
   111
sl@0
   112
	return error;
sl@0
   113
	}
sl@0
   114
sl@0
   115
sl@0
   116
EXPORT_C TInt RMMFControllerProxy::LoadController(TUid aControllerUid, TBool aUseSharedHeap)
sl@0
   117
	{
sl@0
   118
 	CMMFControllerImplementationInformation* controllerInfo = NULL;
sl@0
   119
 	
sl@0
   120
 	TRAPD(err, controllerInfo = CMMFControllerImplementationInformation::NewL(aControllerUid));
sl@0
   121
	if (!err && controllerInfo)
sl@0
   122
		{
sl@0
   123
		err = LoadController(aControllerUid, *controllerInfo, aUseSharedHeap, EFalse);
sl@0
   124
		delete controllerInfo;
sl@0
   125
		}
sl@0
   126
 	return err;
sl@0
   127
	}
sl@0
   128
sl@0
   129
EXPORT_C TInt RMMFControllerProxy::LoadController(const CMMFControllerImplementationInformation& aControllerInfo, TBool aUseSharedHeap)
sl@0
   130
	{
sl@0
   131
	return LoadController(aControllerInfo.Uid(), aControllerInfo, aUseSharedHeap, EFalse);
sl@0
   132
	}
sl@0
   133
sl@0
   134
EXPORT_C TInt RMMFControllerProxy::LoadControllerInSecureDRMProcess(TUid aControllerUid, TBool aUseSharedHeap)
sl@0
   135
	{
sl@0
   136
	CMMFControllerImplementationInformation* controllerInfo = NULL;
sl@0
   137
	
sl@0
   138
	TRAPD(err, controllerInfo = CMMFControllerImplementationInformation::NewL(aControllerUid));
sl@0
   139
	if (!err && controllerInfo)
sl@0
   140
		{
sl@0
   141
		err = LoadController(aControllerUid, *controllerInfo, aUseSharedHeap, ETrue);
sl@0
   142
		delete controllerInfo;
sl@0
   143
		}
sl@0
   144
	return err;
sl@0
   145
	}
sl@0
   146
	
sl@0
   147
EXPORT_C TInt RMMFControllerProxy::LoadControllerInSecureDRMProcess(const CMMFControllerImplementationInformation& aControllerInfo, TBool aUseSharedHeap)
sl@0
   148
	{
sl@0
   149
	return LoadController(aControllerInfo.Uid(), aControllerInfo, aUseSharedHeap, ETrue);
sl@0
   150
	}
sl@0
   151
sl@0
   152
TUint RMMFControllerProxy::ControllersMaxHeapSizeL(TUid aControllerUid)
sl@0
   153
	{
sl@0
   154
	CMMFControllerImplementationInformation* controllerInfo = NULL;
sl@0
   155
sl@0
   156
	TRAPD(err, controllerInfo = CMMFControllerImplementationInformation::NewL(aControllerUid));
sl@0
   157
sl@0
   158
sl@0
   159
	TUint maxHeapSize = KMMFDefaultControllerThreadHeapSize;
sl@0
   160
	
sl@0
   161
	if((err != KErrNone) && (err != KErrCorrupt))
sl@0
   162
		{
sl@0
   163
		delete controllerInfo;
sl@0
   164
		User::Leave(err);
sl@0
   165
		}
sl@0
   166
sl@0
   167
sl@0
   168
	if(controllerInfo && (err == KErrNone))
sl@0
   169
		maxHeapSize = controllerInfo->HeapSpaceRequired();
sl@0
   170
sl@0
   171
	delete controllerInfo;
sl@0
   172
sl@0
   173
	return maxHeapSize;
sl@0
   174
	}
sl@0
   175
sl@0
   176
sl@0
   177
TInt RMMFControllerProxy::DoCreateSubThread(RServer2* aServer2, TUint aMaxHeapSize, TBool aUseSharedHeap, TUint aStackSize)
sl@0
   178
	{
sl@0
   179
	TInt error = KErrNone;
sl@0
   180
sl@0
   181
	TControllerProxyServerParams params;
sl@0
   182
	params.iServer = aServer2;
sl@0
   183
	params.iUsingSharedHeap = aUseSharedHeap;
sl@0
   184
sl@0
   185
#ifdef SYMBIAN_USE_CLIENT_HEAP
sl@0
   186
	// controller threads share the *client* heap (intended for out of memory testing)
sl@0
   187
	error = iSubThread.Create(_L(""), &CMMFControllerProxyServer::StartThread, 
sl@0
   188
			aStackSize, NULL, &params, EOwnerThread);
sl@0
   189
#else
sl@0
   190
	if( aUseSharedHeap )
sl@0
   191
		{
sl@0
   192
		//controller threads all share a controller heap
sl@0
   193
		CMMFControllerHeap* contHeap = static_cast<CMMFControllerHeap*>(Dll::Tls());
sl@0
   194
		if(contHeap == NULL)
sl@0
   195
			{
sl@0
   196
			TRAP(error, contHeap = CMMFControllerHeap::NewL());
sl@0
   197
			if(error)
sl@0
   198
				{			
sl@0
   199
				return error;	
sl@0
   200
				}
sl@0
   201
				
sl@0
   202
			Dll::SetTls(contHeap);
sl@0
   203
			}
sl@0
   204
			
sl@0
   205
		__ASSERT_DEBUG((iFlags&EFlagOpenedSharedHeap)==0, Panic(EPanicHeapHalfOpen));
sl@0
   206
			
sl@0
   207
		RHeap* sharedHeap = contHeap->RegisterHeap();
sl@0
   208
		// We've registered, so record the fact so can "unregister" on close or error
sl@0
   209
		iFlags |= EFlagOpenedSharedHeap; 
sl@0
   210
		
sl@0
   211
		error = iSubThread.Create(KNullDesC, &CMMFControllerProxyServer::StartThread,
sl@0
   212
				aStackSize, sharedHeap, 						
sl@0
   213
				&params, EOwnerThread);		
sl@0
   214
		}
sl@0
   215
	else
sl@0
   216
		{	
sl@0
   217
		// Threads create own heap (default behaviour)
sl@0
   218
		if(aMaxHeapSize < static_cast<TUint>(KMinHeapSize))
sl@0
   219
			aMaxHeapSize = KMinHeapSize; //else raises a USER 111 panic
sl@0
   220
		else if(aMaxHeapSize >  static_cast<TUint>(KMMFControllerProxyMaxHeapSize))
sl@0
   221
			aMaxHeapSize = KMMFControllerProxyMaxHeapSize;
sl@0
   222
		
sl@0
   223
		TThreadCreateInfo threadSettings (KNullDesC, &CMMFControllerProxyServer::StartThread,
sl@0
   224
										  aStackSize, &params);
sl@0
   225
		threadSettings.SetCreateHeap(KMinHeapSize, aMaxHeapSize);
sl@0
   226
		threadSettings.SetOwner(EOwnerThread);
sl@0
   227
		threadSettings.SetPaging(TThreadCreateInfo::EUnpaged);
sl@0
   228
		
sl@0
   229
		error = iSubThread.Create(threadSettings);
sl@0
   230
		}
sl@0
   231
#endif
sl@0
   232
sl@0
   233
	if (error)
sl@0
   234
		{
sl@0
   235
		return error;
sl@0
   236
		}
sl@0
   237
sl@0
   238
	TRequestStatus rendezvous;
sl@0
   239
	iSubThread.Rendezvous(rendezvous);
sl@0
   240
	if (rendezvous != KRequestPending)
sl@0
   241
		{
sl@0
   242
		iSubThread.Kill(0);
sl@0
   243
		}
sl@0
   244
	else
sl@0
   245
		{
sl@0
   246
		iLogonAO->StartMonitoring(iSubThread);
sl@0
   247
		if (iLogonAO->iStatus != KRequestPending)
sl@0
   248
			{
sl@0
   249
			// Failed to logon
sl@0
   250
			iSubThread.RendezvousCancel(rendezvous);
sl@0
   251
			User::WaitForRequest(rendezvous);
sl@0
   252
			iSubThread.Kill(0);
sl@0
   253
			iSubThread.Close();
sl@0
   254
			return iLogonAO->iStatus.Int();
sl@0
   255
			}
sl@0
   256
		else
sl@0
   257
			{
sl@0
   258
			iSubThread.SetPriority(iThreadPriority);
sl@0
   259
			iSubThread.Resume();
sl@0
   260
			}
sl@0
   261
		}
sl@0
   262
		
sl@0
   263
	User::WaitForRequest(rendezvous); // wait for startup or death
sl@0
   264
	
sl@0
   265
	if (rendezvous != KErrNone)
sl@0
   266
		{
sl@0
   267
		iLogonAO->Cancel();
sl@0
   268
		iSubThread.Close();
sl@0
   269
		// if open failed, but we registered the heap, need to release
sl@0
   270
		if((iFlags&EFlagOpenedSharedHeap))
sl@0
   271
			{
sl@0
   272
			ReleaseHeap();
sl@0
   273
			}		
sl@0
   274
		}
sl@0
   275
		
sl@0
   276
	return rendezvous.Int();
sl@0
   277
	}
sl@0
   278
sl@0
   279
EXPORT_C void RMMFControllerProxy::Close()
sl@0
   280
	{
sl@0
   281
#ifdef _DEBUG
sl@0
   282
	_LIT(KMMFClientThreadPanic, "MMFClientThread");
sl@0
   283
#endif
sl@0
   284
	// check if thread was created
sl@0
   285
	TBool subThreadCreated = EFalse;
sl@0
   286
	TRequestStatus logoffStatus;
sl@0
   287
	TBool logoffFailed = EFalse;
sl@0
   288
	if (iSubThread.Handle() != KNullHandle)
sl@0
   289
		{
sl@0
   290
		subThreadCreated = ETrue;
sl@0
   291
		iLogonAO->Cancel();
sl@0
   292
		iSubThread.Logon(logoffStatus);
sl@0
   293
		
sl@0
   294
		if (logoffStatus == KErrNoMemory && iSubThread.ExitType() == EExitPending)
sl@0
   295
			{
sl@0
   296
			// Logon() call has failed because of a lack of memory
sl@0
   297
			logoffFailed = ETrue;
sl@0
   298
			}
sl@0
   299
		}
sl@0
   300
sl@0
   301
	// Close the controller and wait for its exit.
sl@0
   302
	// Close the session to signal the controller proxy server to shut down.
sl@0
   303
	RHandleBase::Close();
sl@0
   304
	
sl@0
   305
	// Now wait for the death of the subthread if we have a valid handle...
sl@0
   306
	if (subThreadCreated)
sl@0
   307
		{
sl@0
   308
		RProcess thisProcess;
sl@0
   309
		RProcess controllerProcess;
sl@0
   310
		iSubThread.Process(controllerProcess);	// ignore error, best try
sl@0
   311
		TBool secureDrmMode = thisProcess.Id() != controllerProcess.Id();
sl@0
   312
		thisProcess.Close();
sl@0
   313
		controllerProcess.Close();
sl@0
   314
				
sl@0
   315
		RTimer timer;
sl@0
   316
		TInt err = timer.CreateLocal();
sl@0
   317
		// If we managed to create the timer and logon to the thread, 
sl@0
   318
		// wait for both the death and the timeout to minimise the risk of deadlock
sl@0
   319
		if (!err && !logoffFailed)
sl@0
   320
			{
sl@0
   321
			TRequestStatus timeout;
sl@0
   322
			timer.After(timeout, KMmfControllerThreadShutdownTimeout);
sl@0
   323
			User::WaitForRequest(logoffStatus, timeout);
sl@0
   324
			if (logoffStatus == KRequestPending)
sl@0
   325
				{
sl@0
   326
				// we have timed out.  Kill the controller thread
sl@0
   327
				iSubThread.LogonCancel(logoffStatus);
sl@0
   328
				User::WaitForRequest(logoffStatus);
sl@0
   329
				
sl@0
   330
				if (!secureDrmMode)
sl@0
   331
					{
sl@0
   332
					// Controller server thread is created in current process
sl@0
   333
				#ifdef _DEBUG
sl@0
   334
					iSubThread.Panic(KMMFClientThreadPanic,KErrDied);
sl@0
   335
				#else
sl@0
   336
					iSubThread.Kill(KErrDied);
sl@0
   337
				#endif
sl@0
   338
					}
sl@0
   339
				else
sl@0
   340
					{
sl@0
   341
					// Controller server thread is created through DRM plugin server
sl@0
   342
					RMMFDRMPluginServerProxy server;
sl@0
   343
					// ignore all RMMFDRMPluginServerProxy errors, best try
sl@0
   344
					err = server.Open();
sl@0
   345
					if (err == KErrNone)
sl@0
   346
						{
sl@0
   347
					#ifdef _DEBUG
sl@0
   348
						server.PanicControllerThread(iSubThread.Id(), KMMFClientThreadPanic, KErrDied);
sl@0
   349
					#else
sl@0
   350
						server.KillControllerThread(iSubThread.Id(), KErrDied);
sl@0
   351
					#endif
sl@0
   352
						server.Close();
sl@0
   353
						}
sl@0
   354
					}
sl@0
   355
				}
sl@0
   356
			else
sl@0
   357
				{
sl@0
   358
				// subthread has exited. Cancel the timer.
sl@0
   359
				timer.Cancel();
sl@0
   360
				User::WaitForRequest(timeout);
sl@0
   361
				}
sl@0
   362
			}
sl@0
   363
		else
sl@0
   364
			{
sl@0
   365
			// We have no timer or we can't logon to the thread so we'll just poll the thread status a maximum
sl@0
   366
			// of 10 times and kill the thread if it hasn't exited after the polling
sl@0
   367
			for (TInt i=0; i<10 && iSubThread.ExitType() == EExitPending; ++i)
sl@0
   368
				{
sl@0
   369
				User::After(KMmfControllerThreadShutdownTimeout/10);	// wait for a while
sl@0
   370
				}
sl@0
   371
				
sl@0
   372
			if (iSubThread.ExitType() == EExitPending)
sl@0
   373
				{
sl@0
   374
				// The polling hasn't been succesful so we kill the thread
sl@0
   375
				if (!secureDrmMode)
sl@0
   376
					{
sl@0
   377
					iSubThread.Kill(KErrDied);
sl@0
   378
					}
sl@0
   379
				else
sl@0
   380
					{
sl@0
   381
					// Controller server thread is created through DRM plugin server
sl@0
   382
					RMMFDRMPluginServerProxy server;
sl@0
   383
					// ignore all RMMFDRMPluginServerProxy errors, best try
sl@0
   384
					err = server.Open();
sl@0
   385
					if (err == KErrNone)
sl@0
   386
						{
sl@0
   387
						server.KillControllerThread(iSubThread.Id(), KErrDied);
sl@0
   388
						}
sl@0
   389
					}
sl@0
   390
				}
sl@0
   391
				
sl@0
   392
			User::WaitForRequest(logoffStatus);
sl@0
   393
			}
sl@0
   394
		timer.Close();
sl@0
   395
		}
sl@0
   396
sl@0
   397
	// Close the handle to the controller thread
sl@0
   398
	iSubThread.Close();
sl@0
   399
	// Delete the Logon AO
sl@0
   400
	if (iLogonAO)
sl@0
   401
		{
sl@0
   402
		delete iLogonAO;
sl@0
   403
		iLogonAO = NULL;
sl@0
   404
		}
sl@0
   405
	// if this is last thread to be killed delete shared heap
sl@0
   406
	if((iFlags&EFlagOpenedSharedHeap))
sl@0
   407
		{
sl@0
   408
		ReleaseHeap();
sl@0
   409
		}	
sl@0
   410
	}
sl@0
   411
sl@0
   412
// Release the shared heap, should only be called if has previously been registered
sl@0
   413
// by this thread
sl@0
   414
void RMMFControllerProxy::ReleaseHeap()
sl@0
   415
	{
sl@0
   416
	__ASSERT_DEBUG((iFlags&EFlagOpenedSharedHeap), Panic(EPanicReleaseWithoutRegister));
sl@0
   417
sl@0
   418
	CMMFControllerHeap* contHeap = static_cast<CMMFControllerHeap*>(Dll::Tls());
sl@0
   419
	__ASSERT_DEBUG(contHeap!=NULL, Panic(EPanicHeapOpenWithoutTls));
sl@0
   420
	
sl@0
   421
	if(contHeap != NULL)
sl@0
   422
		{
sl@0
   423
		TInt refCount = contHeap->ReleaseHeap();
sl@0
   424
		if(refCount == 0)
sl@0
   425
			{  //no other controllers using the heap
sl@0
   426
			delete contHeap;
sl@0
   427
			Dll::SetTls(NULL);
sl@0
   428
			}
sl@0
   429
		}
sl@0
   430
		
sl@0
   431
	iFlags &= ~EFlagOpenedSharedHeap; // clear flag since we've released the heap
sl@0
   432
	}
sl@0
   433
sl@0
   434
EXPORT_C TInt RMMFControllerProxy::SendSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom) const
sl@0
   435
	{
sl@0
   436
	// Make sure we have been opened
sl@0
   437
	if (iSubThread.Handle() == 0)
sl@0
   438
		{
sl@0
   439
		return KErrNotReady;
sl@0
   440
		}
sl@0
   441
	else
sl@0
   442
		return SendReceiveResult(aFunction, aDestination, aDataTo1, aDataTo2, aDataFrom);
sl@0
   443
	}
sl@0
   444
sl@0
   445
sl@0
   446
EXPORT_C TInt RMMFControllerProxy::SendSync(TInt aFunction, const TIpcArgs& aIpcArgs) const
sl@0
   447
	{
sl@0
   448
	// Make sure we have been opened
sl@0
   449
	if (iSubThread.Handle() == 0)
sl@0
   450
		{
sl@0
   451
		return KErrNotReady;
sl@0
   452
		}
sl@0
   453
	else
sl@0
   454
		return RSessionBase::SendReceive(aFunction, aIpcArgs);
sl@0
   455
	}
sl@0
   456
	
sl@0
   457
EXPORT_C void RMMFControllerProxy::SendAsync(TInt aFunction, const TIpcArgs& aIpcArgs, TRequestStatus& aStatus) const
sl@0
   458
	{
sl@0
   459
	// Make sure we have been opened
sl@0
   460
	if (iSubThread.Handle() == 0)
sl@0
   461
		{
sl@0
   462
		TRequestStatus* status = &aStatus;
sl@0
   463
		User::RequestComplete(status, KErrNotReady);
sl@0
   464
		}
sl@0
   465
	else
sl@0
   466
		RSessionBase::SendReceive(aFunction, aIpcArgs, aStatus);
sl@0
   467
	}
sl@0
   468
sl@0
   469
sl@0
   470
sl@0
   471
EXPORT_C TInt RMMFControllerProxy::SendSync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2) const
sl@0
   472
	{
sl@0
   473
	// Make sure we have been opened
sl@0
   474
	if (iSubThread.Handle() == 0)
sl@0
   475
		{
sl@0
   476
		return KErrNotReady;
sl@0
   477
		}
sl@0
   478
	else
sl@0
   479
		return SendReceive(aFunction, aDestination, aDataTo1, aDataTo2);
sl@0
   480
	}
sl@0
   481
sl@0
   482
EXPORT_C void RMMFControllerProxy::SendAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TDes8& aDataFrom, TRequestStatus& aStatus) const
sl@0
   483
	{
sl@0
   484
	if (iSubThread.Handle() == 0)
sl@0
   485
		{
sl@0
   486
		TRequestStatus* stat = &aStatus;
sl@0
   487
		User::RequestComplete(stat, KErrNotReady);
sl@0
   488
		}
sl@0
   489
	else
sl@0
   490
		SendReceiveResult(aFunction, aDestination, aDataTo1, aDataTo2, aDataFrom, aStatus);
sl@0
   491
	}
sl@0
   492
sl@0
   493
EXPORT_C void RMMFControllerProxy::SendAsync(const TMMFMessageDestinationPckg& aDestination, TInt aFunction, const TDesC8& aDataTo1, const TDesC8& aDataTo2, TRequestStatus& aStatus) const
sl@0
   494
	{
sl@0
   495
	if (iSubThread.Handle() == 0)
sl@0
   496
		{
sl@0
   497
		TRequestStatus* stat = &aStatus;
sl@0
   498
		User::RequestComplete(stat, KErrNotReady);
sl@0
   499
		}
sl@0
   500
	else
sl@0
   501
		SendReceive(aFunction, aDestination, aDataTo1, aDataTo2, aStatus);
sl@0
   502
	}
sl@0
   503
sl@0
   504
EXPORT_C void RMMFControllerProxy::ReceiveEvents(TMMFEventPckg& aEvent, TRequestStatus& aStatus)
sl@0
   505
	{
sl@0
   506
	SendAsync(iDestinationPckg, EMMFControllerProxyReceiveEvents, KNullDesC8, KNullDesC8, aEvent, aStatus);
sl@0
   507
	}
sl@0
   508
sl@0
   509
EXPORT_C TInt RMMFControllerProxy::CancelReceiveEvents()
sl@0
   510
	{
sl@0
   511
	return SendSync(iDestinationPckg, EMMFControllerProxyCancelReceiveEvents, KNullDesC8, KNullDesC8);
sl@0
   512
	}
sl@0
   513
sl@0
   514
EXPORT_C TInt RMMFControllerProxy::SetThreadPriority(const TThreadPriority& aPriority) const
sl@0
   515
	{
sl@0
   516
	TInt err = KErrNone;
sl@0
   517
sl@0
   518
	if (iSubThread.Handle() == 0)
sl@0
   519
		{
sl@0
   520
		err = KErrNotReady;
sl@0
   521
		}
sl@0
   522
	else
sl@0
   523
		{
sl@0
   524
		if (iThreadPriority != aPriority)
sl@0
   525
			{
sl@0
   526
			// This is a const method so cast it away to store the priority
sl@0
   527
			RMMFControllerProxy* nonConstThis = const_cast<RMMFControllerProxy*>(this);
sl@0
   528
			nonConstThis->iThreadPriority = aPriority;
sl@0
   529
			}
sl@0
   530
			
sl@0
   531
		// check controller thread creation location
sl@0
   532
		RProcess thisProcess;
sl@0
   533
		RProcess controllerProcess;
sl@0
   534
		err = iSubThread.Process(controllerProcess);
sl@0
   535
		
sl@0
   536
		if (err == KErrNone)
sl@0
   537
			{
sl@0
   538
			if (thisProcess.Id() == controllerProcess.Id())
sl@0
   539
				{
sl@0
   540
				// Controller server thread is created in current process
sl@0
   541
				if (iSubThread.Priority() != iThreadPriority)
sl@0
   542
					{
sl@0
   543
					iSubThread.Suspend();
sl@0
   544
					iSubThread.SetPriority(iThreadPriority);
sl@0
   545
					iSubThread.Resume();
sl@0
   546
					}
sl@0
   547
				}
sl@0
   548
			else
sl@0
   549
				{
sl@0
   550
				// Controller server thread is created through DRM plugin server
sl@0
   551
				RMMFDRMPluginServerProxy server;
sl@0
   552
				err = server.Open();
sl@0
   553
				if (err == KErrNone)
sl@0
   554
					{
sl@0
   555
					err = server.SetThreadPriority(iSubThread.Id(), iThreadPriority);
sl@0
   556
					server.Close();
sl@0
   557
					}
sl@0
   558
				}
sl@0
   559
			}
sl@0
   560
		thisProcess.Close();
sl@0
   561
		controllerProcess.Close();
sl@0
   562
		}
sl@0
   563
	return err;
sl@0
   564
	}
sl@0
   565
	
sl@0
   566
void RMMFControllerProxy::ThreadTerminated()
sl@0
   567
	{
sl@0
   568
	// The controller subthread has died and the controller should be closed
sl@0
   569
	iSubThread.Close();
sl@0
   570
	}
sl@0
   571
sl@0
   572
TInt RMMFControllerProxy::DoCreateSessionForNoDRMCapClient(TUint aMaxHeapSize, TBool aUseSharedHeap, TUint aStackSize)
sl@0
   573
	{
sl@0
   574
	TThreadId tid;
sl@0
   575
	RMMFDRMPluginServerProxy server;
sl@0
   576
    TInt error = server.Open();
sl@0
   577
    
sl@0
   578
    if(!error)
sl@0
   579
    	{
sl@0
   580
    	error = server.LaunchControllerServer(aMaxHeapSize, aUseSharedHeap, tid, aStackSize);
sl@0
   581
    	}		    
sl@0
   582
    if(!error)
sl@0
   583
		{
sl@0
   584
		error = iSubThread.Open(tid, EOwnerThread);
sl@0
   585
		if(!error)
sl@0
   586
			{
sl@0
   587
			iLogonAO->StartMonitoring(iSubThread);
sl@0
   588
			if (iLogonAO->iStatus != KRequestPending)
sl@0
   589
				{
sl@0
   590
				// Failed to logon
sl@0
   591
				server.KillControllerThread(tid, 0);
sl@0
   592
				iSubThread.Close();
sl@0
   593
				error = iLogonAO->iStatus.Int();
sl@0
   594
				}
sl@0
   595
			}
sl@0
   596
		else
sl@0
   597
			{
sl@0
   598
			// Failed to open thread handle
sl@0
   599
			server.KillControllerThread(tid, 0);
sl@0
   600
			}
sl@0
   601
		}
sl@0
   602
	if(!error)
sl@0
   603
		{
sl@0
   604
		error = server.SetThreadPriority(tid, iThreadPriority);
sl@0
   605
		if(!error)
sl@0
   606
			{
sl@0
   607
			error = SetReturnedHandle(server.GetControllerSessionHandle());	
sl@0
   608
			}
sl@0
   609
		if(error)
sl@0
   610
			{
sl@0
   611
			// Failed to create session with controller
sl@0
   612
			iLogonAO->Cancel();
sl@0
   613
			server.KillControllerThread(tid, 0);
sl@0
   614
			iSubThread.Close();
sl@0
   615
			}
sl@0
   616
		}
sl@0
   617
    server.Close();
sl@0
   618
    return error;
sl@0
   619
	}
sl@0
   620
sl@0
   621
sl@0
   622
// RMMFCustomCommandsBase
sl@0
   623
sl@0
   624
/**
sl@0
   625
Constructor.
sl@0
   626
sl@0
   627
@param  aController
sl@0
   628
        A reference to the controller client class that will be used to send
sl@0
   629
        custom commands to the controller plugin.
sl@0
   630
@param  aInterfaceId
sl@0
   631
        The UID of the custom command interface that is provided by this client
sl@0
   632
        API class.
sl@0
   633
sl@0
   634
@since 7.0s
sl@0
   635
*/
sl@0
   636
EXPORT_C RMMFCustomCommandsBase::RMMFCustomCommandsBase(RMMFController& aController, TUid aInterfaceId)
sl@0
   637
	: iController(aController), iDestinationPckg(aInterfaceId)
sl@0
   638
	{
sl@0
   639
	}
sl@0
   640
sl@0
   641
sl@0
   642
// TMMFMessageDestination
sl@0
   643
EXPORT_C TMMFMessageDestination::TMMFMessageDestination()
sl@0
   644
	: iInterfaceId(KNullUid), iDestinationHandle(KMMFObjectHandleController)
sl@0
   645
	{
sl@0
   646
	}
sl@0
   647
sl@0
   648
EXPORT_C TMMFMessageDestination::TMMFMessageDestination(TUid aInterfaceId)
sl@0
   649
	: iInterfaceId(aInterfaceId), iDestinationHandle(KMMFObjectHandleController)
sl@0
   650
	{
sl@0
   651
	}
sl@0
   652
sl@0
   653
EXPORT_C TMMFMessageDestination::TMMFMessageDestination(TUid aInterfaceId, TInt aDestinationHandle)
sl@0
   654
	: iInterfaceId(aInterfaceId), iDestinationHandle(aDestinationHandle)
sl@0
   655
	{
sl@0
   656
	}
sl@0
   657
sl@0
   658
EXPORT_C TMMFMessageDestination::TMMFMessageDestination(const TMMFMessageDestination& aOther)
sl@0
   659
	: iInterfaceId(aOther.iInterfaceId), iDestinationHandle(aOther.iDestinationHandle)
sl@0
   660
	{
sl@0
   661
	}
sl@0
   662
sl@0
   663
EXPORT_C TUid TMMFMessageDestination::InterfaceId() const
sl@0
   664
	{
sl@0
   665
	return iInterfaceId;
sl@0
   666
	}
sl@0
   667
sl@0
   668
EXPORT_C TInt TMMFMessageDestination::DestinationHandle() const
sl@0
   669
	{
sl@0
   670
	return iDestinationHandle;
sl@0
   671
	}
sl@0
   672
sl@0
   673
EXPORT_C TBool TMMFMessageDestination::operator==(const TMMFMessageDestination& aOther) const
sl@0
   674
	{
sl@0
   675
	return ((iInterfaceId==aOther.iInterfaceId) && (iDestinationHandle==aOther.iDestinationHandle));
sl@0
   676
	}
sl@0
   677
sl@0
   678
sl@0
   679
sl@0
   680
// CMMFControllerProxySession
sl@0
   681
CMMFControllerProxySession* CMMFControllerProxySession::NewL()
sl@0
   682
	{
sl@0
   683
	CMMFControllerProxySession* s = new(ELeave) CMMFControllerProxySession;
sl@0
   684
	return s;
sl@0
   685
	}
sl@0
   686
sl@0
   687
void CMMFControllerProxySession::CreateL(const CMmfIpcServer& aServer)
sl@0
   688
	{
sl@0
   689
	CMmfIpcSession::CreateL(aServer);
sl@0
   690
	iServer = STATIC_CAST(CMMFControllerProxyServer*, (CONST_CAST(CMmfIpcServer*, &aServer)));
sl@0
   691
	iServer->SessionCreated();
sl@0
   692
	}
sl@0
   693
sl@0
   694
CMMFControllerProxySession::~CMMFControllerProxySession()
sl@0
   695
	{
sl@0
   696
	delete iController;
sl@0
   697
	delete iEventReceiver;
sl@0
   698
	iEvents.Close();
sl@0
   699
	iServer->SessionDestroyed();
sl@0
   700
	}
sl@0
   701
sl@0
   702
sl@0
   703
sl@0
   704
void CMMFControllerProxySession::ServiceL(const RMmfIpcMessage& aMessage)
sl@0
   705
	{
sl@0
   706
	TMMFMessage message(aMessage);
sl@0
   707
	// Get the destination info from the client.
sl@0
   708
	message.FetchDestinationL();
sl@0
   709
sl@0
   710
	if (message.Destination().InterfaceId() == KUidInterfaceMMFControllerProxy)
sl@0
   711
		{
sl@0
   712
		// Message for controller proxy so decode here
sl@0
   713
		TBool complete = EFalse;
sl@0
   714
		switch (message.Function())
sl@0
   715
			{
sl@0
   716
		case EMMFControllerProxyReceiveEvents:
sl@0
   717
			complete = ReceiveEventsL(message);
sl@0
   718
			break;
sl@0
   719
		case EMMFControllerProxyCancelReceiveEvents:
sl@0
   720
			complete = CancelReceiveEvents(message);
sl@0
   721
			break;
sl@0
   722
		case EMMFControllerProxyLoadControllerPluginByUid:
sl@0
   723
			complete = LoadControllerL(message);
sl@0
   724
			break;
sl@0
   725
		default:
sl@0
   726
			User::Leave(KErrNotSupported);
sl@0
   727
			}
sl@0
   728
		if (complete)
sl@0
   729
			message.Complete(KErrNone);
sl@0
   730
		}
sl@0
   731
	else
sl@0
   732
		{
sl@0
   733
		// Message for controller so forward on to controller baseclass
sl@0
   734
		if (iController)
sl@0
   735
			iController->HandleRequestL(message);
sl@0
   736
		else
sl@0
   737
			User::Leave(KErrNotReady);
sl@0
   738
		}
sl@0
   739
	}
sl@0
   740
sl@0
   741
CMMFControllerProxySession::CMMFControllerProxySession()
sl@0
   742
	{
sl@0
   743
	}
sl@0
   744
sl@0
   745
TBool CMMFControllerProxySession::ReceiveEventsL(TMMFMessage& aMessage)
sl@0
   746
	{
sl@0
   747
	if (iEventReceiver)
sl@0
   748
		User::Leave(KErrAlreadyExists);
sl@0
   749
	iEventReceiver = CMMFEventReceiver::NewL(aMessage);
sl@0
   750
	//send the next cached event (if any) to the client
sl@0
   751
	if (iEvents.Count() > 0)
sl@0
   752
		{
sl@0
   753
		TMMFEvent& event = iEvents[0];
sl@0
   754
		iEventReceiver->SendEvent(event);
sl@0
   755
		delete iEventReceiver;
sl@0
   756
		iEventReceiver=NULL;
sl@0
   757
		iEvents.Remove(0);
sl@0
   758
		}
sl@0
   759
	return EFalse;
sl@0
   760
	}
sl@0
   761
sl@0
   762
TBool CMMFControllerProxySession::CancelReceiveEvents(TMMFMessage& /*aMessage*/)
sl@0
   763
	{
sl@0
   764
	delete iEventReceiver;
sl@0
   765
	iEventReceiver = NULL;
sl@0
   766
	return ETrue;
sl@0
   767
	}
sl@0
   768
sl@0
   769
TInt CMMFControllerProxySession::SendEventToClient(const TMMFEvent& aEvent)
sl@0
   770
	{
sl@0
   771
	TInt error = KErrNone;
sl@0
   772
	if (iEventReceiver)
sl@0
   773
		{
sl@0
   774
		//send event to client now
sl@0
   775
		iEventReceiver->SendEvent(aEvent);
sl@0
   776
		delete iEventReceiver;
sl@0
   777
		iEventReceiver=NULL;
sl@0
   778
		error = KErrNone;
sl@0
   779
		}
sl@0
   780
	else
sl@0
   781
		{
sl@0
   782
		//queue the request for later
sl@0
   783
		TMMFEvent event(aEvent);
sl@0
   784
		//if we've exceeded the max number of cached messages, delete the first and append this one to the end
sl@0
   785
		if (iEvents.Count() >= KMMFControllerProxyMaxCachedMessages)
sl@0
   786
			iEvents.Remove(0);
sl@0
   787
		error = iEvents.Append(event);
sl@0
   788
		}
sl@0
   789
	return error;
sl@0
   790
	}
sl@0
   791
sl@0
   792
TBool CMMFControllerProxySession::LoadControllerL(TMMFMessage& aMessage)
sl@0
   793
	{
sl@0
   794
	TMMFUidPckg pckg;
sl@0
   795
	aMessage.ReadData1FromClientL(pckg);
sl@0
   796
	
sl@0
   797
	RThread clientThread;
sl@0
   798
	aMessage.iMessage.ClientL(clientThread);
sl@0
   799
	CleanupClosePushL(clientThread);
sl@0
   800
	iController = CMMFController::NewL(pckg(), *this, clientThread.Id());
sl@0
   801
	CleanupStack::PopAndDestroy(&clientThread);
sl@0
   802
	return ETrue;
sl@0
   803
	}
sl@0
   804
sl@0
   805
sl@0
   806
sl@0
   807
CMMFControllerProxyServer* CMMFControllerProxyServer::NewL(RServer2* aServer2)
sl@0
   808
	{
sl@0
   809
	CMMFControllerProxyServer* s = new(ELeave) CMMFControllerProxyServer();
sl@0
   810
	CleanupStack::PushL(s);
sl@0
   811
	s->ConstructL(aServer2);
sl@0
   812
	CleanupStack::Pop(s);
sl@0
   813
	return s;
sl@0
   814
	}
sl@0
   815
sl@0
   816
CMMFControllerProxyServer::CMMFControllerProxyServer() :
sl@0
   817
	CMmfIpcServer(EPriorityStandard, EGlobalSharableSessions)
sl@0
   818
	{
sl@0
   819
	}
sl@0
   820
sl@0
   821
void CMMFControllerProxyServer::ConstructL(RServer2* aServer2)
sl@0
   822
	{
sl@0
   823
	SetPinClientDescriptors(ETrue);
sl@0
   824
	
sl@0
   825
	StartL(KNullDesC);
sl@0
   826
	*aServer2 = CServer2::Server();
sl@0
   827
	
sl@0
   828
	iShutdownTimer = CMMFControllerProxyShutdown::NewL();
sl@0
   829
	iShutdownTimer->Start();
sl@0
   830
	}
sl@0
   831
sl@0
   832
CMMFControllerProxyServer::~CMMFControllerProxyServer()
sl@0
   833
	{
sl@0
   834
	delete iShutdownTimer;
sl@0
   835
	}
sl@0
   836
sl@0
   837
EXPORT_C TInt CMMFControllerProxyServer::StartThread(TAny* aParam)
sl@0
   838
	{
sl@0
   839
	TInt err = KErrNone;
sl@0
   840
	//create cleanupstack
sl@0
   841
	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
sl@0
   842
	if (!cleanup)
sl@0
   843
		err = KErrNoMemory;
sl@0
   844
	if (!err)
sl@0
   845
		{
sl@0
   846
		TRAP(err, DoStartThreadL(aParam));
sl@0
   847
		}
sl@0
   848
	delete cleanup;
sl@0
   849
	return err;
sl@0
   850
	}
sl@0
   851
	
sl@0
   852
void CMMFControllerProxyServer::RenameControllerProxyThread()
sl@0
   853
	{
sl@0
   854
	RThread thread;
sl@0
   855
	TThreadId threadId;
sl@0
   856
	TName name;
sl@0
   857
	name.Append(KMMFControllerProxyServerName);
sl@0
   858
	threadId = thread.Id();
sl@0
   859
	name.AppendNum(threadId.Id(),EHex);
sl@0
   860
	User::RenameThread(name);
sl@0
   861
	}
sl@0
   862
sl@0
   863
void CMMFControllerProxyServer::DoStartThreadL(TAny* aParam)
sl@0
   864
	{
sl@0
   865
	TControllerProxyServerParams* params = static_cast<TControllerProxyServerParams*>(aParam);
sl@0
   866
	
sl@0
   867
	//Rename Current thread to unique name
sl@0
   868
	RenameControllerProxyThread();
sl@0
   869
	
sl@0
   870
#ifndef SYMBIAN_USE_CLIENT_HEAP
sl@0
   871
	TBool usingSharedHeap = params->iUsingSharedHeap; // take copy since params invalid after Rendezvous
sl@0
   872
	
sl@0
   873
	if( ! usingSharedHeap )
sl@0
   874
		{
sl@0
   875
		__UHEAP_MARK;
sl@0
   876
		}
sl@0
   877
sl@0
   878
#endif
sl@0
   879
	// create and install the active scheduler we need
sl@0
   880
	CActiveScheduler* s=new(ELeave) CActiveScheduler;
sl@0
   881
	CleanupStack::PushL(s);
sl@0
   882
	CActiveScheduler::Install(s);
sl@0
   883
	// create the server (leave it on the cleanup stack)
sl@0
   884
	CleanupStack::PushL(CMMFControllerProxyServer::NewL( params->iServer ) );
sl@0
   885
	// Initialisation complete, now signal the client
sl@0
   886
	RThread::Rendezvous(KErrNone);
sl@0
   887
	// Ready to run
sl@0
   888
	CActiveScheduler::Start();
sl@0
   889
	
sl@0
   890
	REComSession::FinalClose();
sl@0
   891
	
sl@0
   892
	// Cleanup the server and scheduler
sl@0
   893
	CleanupStack::PopAndDestroy(2, s);
sl@0
   894
#ifndef SYMBIAN_USE_CLIENT_HEAP
sl@0
   895
	if( ! usingSharedHeap )
sl@0
   896
		{
sl@0
   897
		__UHEAP_MARKEND;
sl@0
   898
		}
sl@0
   899
#endif
sl@0
   900
	}
sl@0
   901
sl@0
   902
TInt CMMFControllerProxyServer::RunError(TInt aError)
sl@0
   903
	{
sl@0
   904
	// Send error to the client
sl@0
   905
	Message().Complete(aError);
sl@0
   906
	ReStart();
sl@0
   907
	return KErrNone;
sl@0
   908
	}
sl@0
   909
sl@0
   910
CMmfIpcSession* CMMFControllerProxyServer::NewSessionL(const TVersion& aVersion) const
sl@0
   911
	{
sl@0
   912
	// Only one session is allowed to connect to us
sl@0
   913
	if (iHaveSession)
sl@0
   914
		User::Leave(KErrAlreadyExists);
sl@0
   915
	// Check that the version number of the client is correct
sl@0
   916
	if (!User::QueryVersionSupported(KMMFControllerProxyVersion, aVersion))
sl@0
   917
		User::Leave(KErrNotSupported);
sl@0
   918
sl@0
   919
	return CMMFControllerProxySession::NewL();
sl@0
   920
	}
sl@0
   921
sl@0
   922
void CMMFControllerProxyServer::SessionCreated()
sl@0
   923
	{
sl@0
   924
	iHaveSession = ETrue;
sl@0
   925
	// Stop the shutdown timer
sl@0
   926
	iShutdownTimer->Cancel();
sl@0
   927
	}
sl@0
   928
sl@0
   929
void CMMFControllerProxyServer::SessionDestroyed()
sl@0
   930
	{
sl@0
   931
	// Need to shut down
sl@0
   932
	iShutdownTimer->ShutdownNow();
sl@0
   933
	}
sl@0
   934
sl@0
   935
CMMFControllerProxyShutdown* CMMFControllerProxyShutdown::NewL() 
sl@0
   936
	{
sl@0
   937
	CMMFControllerProxyShutdown* s = new(ELeave) CMMFControllerProxyShutdown();
sl@0
   938
	CleanupStack::PushL(s);
sl@0
   939
	s->ConstructL();
sl@0
   940
	CleanupStack::Pop(s);
sl@0
   941
	return s;
sl@0
   942
	}
sl@0
   943
sl@0
   944
CMMFControllerProxyShutdown::CMMFControllerProxyShutdown() : 
sl@0
   945
	CTimer(EPriorityLow)
sl@0
   946
	{
sl@0
   947
	CActiveScheduler::Add(this);
sl@0
   948
	}
sl@0
   949
sl@0
   950
void CMMFControllerProxyShutdown::ConstructL()
sl@0
   951
	{
sl@0
   952
	CTimer::ConstructL();
sl@0
   953
	}
sl@0
   954
sl@0
   955
void CMMFControllerProxyShutdown::Start()
sl@0
   956
	{
sl@0
   957
	After(EMMFControllerProxyShutdownDelay);
sl@0
   958
	}
sl@0
   959
sl@0
   960
void CMMFControllerProxyShutdown::RunL()
sl@0
   961
	{
sl@0
   962
	ShutdownNow();
sl@0
   963
	}
sl@0
   964
sl@0
   965
void CMMFControllerProxyShutdown::ShutdownNow()
sl@0
   966
	{
sl@0
   967
	CActiveScheduler::Stop();
sl@0
   968
	}
sl@0
   969
sl@0
   970
sl@0
   971
sl@0
   972
sl@0
   973
sl@0
   974
sl@0
   975
sl@0
   976
CMMFEventReceiver* CMMFEventReceiver::NewL(const TMMFMessage& aMessage)
sl@0
   977
	{
sl@0
   978
	return new(ELeave) CMMFEventReceiver(aMessage);
sl@0
   979
	}
sl@0
   980
sl@0
   981
CMMFEventReceiver::~CMMFEventReceiver()
sl@0
   982
	{
sl@0
   983
	if (!(iMessage.IsCompleted()))
sl@0
   984
		iMessage.Complete(KErrDied);
sl@0
   985
	}
sl@0
   986
sl@0
   987
void CMMFEventReceiver::SendEvent(const TMMFEvent& aEvent)
sl@0
   988
	{
sl@0
   989
	TMMFEventPckg eventpckg(aEvent);
sl@0
   990
	TInt err = iMessage.WriteDataToClient(eventpckg);
sl@0
   991
	iMessage.Complete(err);
sl@0
   992
	}
sl@0
   993
sl@0
   994
CMMFEventReceiver::CMMFEventReceiver(const TMMFMessage& aMessage) : iMessage(aMessage)
sl@0
   995
	{
sl@0
   996
	}
sl@0
   997
sl@0
   998
sl@0
   999
sl@0
  1000
// TMMFMessage
sl@0
  1001
EXPORT_C TMMFMessage::TMMFMessage(const TMMFMessage& aMessage) :
sl@0
  1002
	iMessage(aMessage.iMessage), 
sl@0
  1003
#ifdef __MMF_USE_IPC_V2__
sl@0
  1004
	iFunction(aMessage.iFunction),
sl@0
  1005
#endif  // __MMF_USE_IPC_V2__
sl@0
  1006
	iDestination(aMessage.iDestination), 
sl@0
  1007
	iAmCompleted(aMessage.iAmCompleted)
sl@0
  1008
	{
sl@0
  1009
	}
sl@0
  1010
sl@0
  1011
EXPORT_C const TMMFMessageDestination& TMMFMessage::Destination()
sl@0
  1012
	{
sl@0
  1013
	return iDestination;
sl@0
  1014
	}
sl@0
  1015
sl@0
  1016
EXPORT_C TInt TMMFMessage::Function()
sl@0
  1017
	{
sl@0
  1018
#ifdef __MMF_USE_IPC_V2__
sl@0
  1019
	return iFunction;
sl@0
  1020
#else
sl@0
  1021
	return iMessage.Function();
sl@0
  1022
#endif // __MMF_USE_IPC_V2__
sl@0
  1023
	}
sl@0
  1024
sl@0
  1025
EXPORT_C TInt TMMFMessage::SizeOfData1FromClient()
sl@0
  1026
	{
sl@0
  1027
#ifdef __MMF_USE_IPC_V2__
sl@0
  1028
	return iMessage.GetDesLength(1);
sl@0
  1029
#else
sl@0
  1030
	return iMessage.Client().GetDesLength(iMessage.Ptr1());
sl@0
  1031
#endif // __MMF_USE_IPC_V2__
sl@0
  1032
	}
sl@0
  1033
sl@0
  1034
EXPORT_C void TMMFMessage::ReadData1FromClientL(TDes8& aDes)
sl@0
  1035
	{
sl@0
  1036
#ifdef __MMF_USE_IPC_V2__
sl@0
  1037
	iMessage.ReadL(1, aDes);
sl@0
  1038
#else
sl@0
  1039
	iMessage.ReadL(iMessage.Ptr1(), aDes);
sl@0
  1040
#endif // __MMF_USE_IPC_V2__
sl@0
  1041
	}
sl@0
  1042
sl@0
  1043
EXPORT_C TInt TMMFMessage::ReadData1FromClient(TDes8& aDes)
sl@0
  1044
	{
sl@0
  1045
	TRAPD(err, ReadData1FromClientL(aDes));
sl@0
  1046
	return err;
sl@0
  1047
	}
sl@0
  1048
sl@0
  1049
EXPORT_C TInt TMMFMessage::SizeOfData2FromClient()
sl@0
  1050
	{
sl@0
  1051
#ifdef __MMF_USE_IPC_V2__
sl@0
  1052
	return iMessage.GetDesLength(2);
sl@0
  1053
#else
sl@0
  1054
	return iMessage.Client().GetDesLength(iMessage.Ptr2());
sl@0
  1055
#endif // __MMF_USE_IPC_V2__
sl@0
  1056
	}
sl@0
  1057
sl@0
  1058
EXPORT_C void TMMFMessage::ReadData2FromClientL(TDes8& aDes)
sl@0
  1059
	{
sl@0
  1060
#ifdef __MMF_USE_IPC_V2__
sl@0
  1061
	iMessage.ReadL(2, aDes);
sl@0
  1062
#else
sl@0
  1063
	iMessage.ReadL(iMessage.Ptr2(), aDes);
sl@0
  1064
#endif // __MMF_USE_IPC_V2__
sl@0
  1065
	}
sl@0
  1066
sl@0
  1067
EXPORT_C TInt TMMFMessage::ReadData2FromClient(TDes8& aDes)
sl@0
  1068
	{
sl@0
  1069
	TRAPD(err, ReadData2FromClientL(aDes));
sl@0
  1070
	return err;
sl@0
  1071
	}
sl@0
  1072
sl@0
  1073
EXPORT_C void TMMFMessage::WriteDataToClientL(const TDesC8& aDes)
sl@0
  1074
	{
sl@0
  1075
#ifdef __MMF_USE_IPC_V2__
sl@0
  1076
	iMessage.WriteL(3, aDes);
sl@0
  1077
#else
sl@0
  1078
	iMessage.WriteL(iMessage.Ptr3(), aDes);
sl@0
  1079
#endif // __MMF_USE_IPC_V2__
sl@0
  1080
	}
sl@0
  1081
sl@0
  1082
EXPORT_C TInt TMMFMessage::WriteDataToClient(const TDesC8& aDes)
sl@0
  1083
	{
sl@0
  1084
	TRAPD(err, WriteDataToClientL(aDes));
sl@0
  1085
	return err;
sl@0
  1086
	}
sl@0
  1087
sl@0
  1088
EXPORT_C void TMMFMessage::Complete(TInt aReason)
sl@0
  1089
	{
sl@0
  1090
	iMessage.Complete(aReason);
sl@0
  1091
	iAmCompleted = ETrue;
sl@0
  1092
	}
sl@0
  1093
sl@0
  1094
EXPORT_C TBool TMMFMessage::IsCompleted()
sl@0
  1095
	{
sl@0
  1096
	return iAmCompleted;
sl@0
  1097
	}
sl@0
  1098
	
sl@0
  1099
EXPORT_C void TMMFMessage::AdoptFileHandleFromClientL(TInt aFsHandleIndex, TInt aFileHandleIndex, RFile& aFile)
sl@0
  1100
	{
sl@0
  1101
	User::LeaveIfError(aFile.AdoptFromClient(RMessage2(iMessage) , aFsHandleIndex, aFileHandleIndex));
sl@0
  1102
	}
sl@0
  1103
sl@0
  1104
EXPORT_C TMMFMessage::TMMFMessage(const RMmfIpcMessage& aMessage) :
sl@0
  1105
	iMessage(aMessage), 
sl@0
  1106
#ifdef __MMF_USE_IPC_V2__
sl@0
  1107
	iFunction(aMessage.Function()),
sl@0
  1108
#endif // __MMF_USE_IPC_V2__
sl@0
  1109
	iAmCompleted(EFalse)
sl@0
  1110
	{
sl@0
  1111
	}
sl@0
  1112
sl@0
  1113
EXPORT_C void TMMFMessage::FetchDestinationL()
sl@0
  1114
	{
sl@0
  1115
	// Read the destination info from the client
sl@0
  1116
	TMMFMessageDestinationPckg pckg;
sl@0
  1117
#ifdef __MMF_USE_IPC_V2__
sl@0
  1118
	iMessage.ReadL(0, pckg);
sl@0
  1119
#else
sl@0
  1120
	iMessage.ReadL(iMessage.Ptr0(), pckg);
sl@0
  1121
#endif // __MMF_USE_IPC_V2__
sl@0
  1122
	iDestination = pckg();
sl@0
  1123
	}
sl@0
  1124
sl@0
  1125
sl@0
  1126
// CMMFObject
sl@0
  1127
sl@0
  1128
/**
sl@0
  1129
Constructor.
sl@0
  1130
sl@0
  1131
@param  aInterfaceId
sl@0
  1132
        The UID of the interface provided by this object.
sl@0
  1133
@since 7.0s
sl@0
  1134
*/
sl@0
  1135
EXPORT_C CMMFObject::CMMFObject(TUid aInterfaceId)
sl@0
  1136
	: iHandle(aInterfaceId, KMMFObjectHandleNull)
sl@0
  1137
	{
sl@0
  1138
	}
sl@0
  1139
sl@0
  1140
/**
sl@0
  1141
Destructor.
sl@0
  1142
*/
sl@0
  1143
EXPORT_C CMMFObject::~CMMFObject()
sl@0
  1144
	{
sl@0
  1145
	}
sl@0
  1146
sl@0
  1147
/**
sl@0
  1148
Returns the handle of the object.
sl@0
  1149
sl@0
  1150
@return The handle of this object.
sl@0
  1151
sl@0
  1152
@since  7.0s
sl@0
  1153
*/
sl@0
  1154
EXPORT_C const TMMFMessageDestination& CMMFObject::Handle()
sl@0
  1155
	{
sl@0
  1156
	return iHandle;
sl@0
  1157
	}
sl@0
  1158
sl@0
  1159
/**
sl@0
  1160
Compares two CMMFObjects by comparing their handles.
sl@0
  1161
sl@0
  1162
@param  aOther
sl@0
  1163
        The object to be compared with this object.
sl@0
  1164
sl@0
  1165
@return A boolean indicating if the two CMMFObjects are the same. ETrue if they are the same,
sl@0
  1166
        EFalse if the objects are different.
sl@0
  1167
@since  7.0s
sl@0
  1168
*/
sl@0
  1169
EXPORT_C TBool CMMFObject::operator==(const CMMFObject& aOther)
sl@0
  1170
	{
sl@0
  1171
	return (iHandle==aOther.iHandle);
sl@0
  1172
	}
sl@0
  1173
sl@0
  1174
void CMMFObject::SetHandle(const TMMFMessageDestination& aNewHandle)
sl@0
  1175
	{
sl@0
  1176
	iHandle = aNewHandle;
sl@0
  1177
	}
sl@0
  1178
sl@0
  1179
sl@0
  1180
// CMMFDataSourceHolder
sl@0
  1181
sl@0
  1182
/**
sl@0
  1183
Constructor.
sl@0
  1184
sl@0
  1185
@param  aDataSource
sl@0
  1186
        The data source to be wrapped.
sl@0
  1187
sl@0
  1188
@since  7.0s
sl@0
  1189
*/
sl@0
  1190
EXPORT_C CMMFDataSourceHolder::CMMFDataSourceHolder(MDataSource& aDataSource)
sl@0
  1191
	: CMMFObject(KUidInterfaceMMFDataSourceHolder), iDataSource(&aDataSource)
sl@0
  1192
	{
sl@0
  1193
	}
sl@0
  1194
sl@0
  1195
/**
sl@0
  1196
Destructor.
sl@0
  1197
sl@0
  1198
Note: This deletes the data source.
sl@0
  1199
sl@0
  1200
@since 7.0s
sl@0
  1201
*/
sl@0
  1202
EXPORT_C CMMFDataSourceHolder::~CMMFDataSourceHolder()
sl@0
  1203
	{
sl@0
  1204
	delete iDataSource;
sl@0
  1205
	}
sl@0
  1206
sl@0
  1207
/**
sl@0
  1208
Returns a reference to the data source.
sl@0
  1209
sl@0
  1210
@return The data source.
sl@0
  1211
sl@0
  1212
@since  7.0s
sl@0
  1213
*/
sl@0
  1214
EXPORT_C MDataSource& CMMFDataSourceHolder::DataSource()
sl@0
  1215
	{
sl@0
  1216
	return *iDataSource;
sl@0
  1217
	}
sl@0
  1218
sl@0
  1219
/**
sl@0
  1220
Implementation of the pure virtual function inherited from CMMFObject.
sl@0
  1221
sl@0
  1222
Passes the request directly to the data source.
sl@0
  1223
sl@0
  1224
@param  aMessage
sl@0
  1225
        The message to be handled.
sl@0
  1226
sl@0
  1227
@since  7.0s
sl@0
  1228
*/
sl@0
  1229
EXPORT_C void CMMFDataSourceHolder::HandleRequest(TMMFMessage& aMessage)
sl@0
  1230
	{
sl@0
  1231
	iDataSource->SourceCustomCommand(aMessage);
sl@0
  1232
	}
sl@0
  1233
sl@0
  1234
sl@0
  1235
// CMMFDataSinkHolder
sl@0
  1236
sl@0
  1237
/**
sl@0
  1238
Constructor.
sl@0
  1239
sl@0
  1240
@param  aDataSink
sl@0
  1241
        The data sink to be wrapped.
sl@0
  1242
@since 7.0s
sl@0
  1243
*/
sl@0
  1244
EXPORT_C CMMFDataSinkHolder::CMMFDataSinkHolder(MDataSink& aDataSink)
sl@0
  1245
	: CMMFObject(KUidInterfaceMMFDataSinkHolder), iDataSink(&aDataSink)
sl@0
  1246
	{
sl@0
  1247
	}
sl@0
  1248
sl@0
  1249
/**
sl@0
  1250
Destructor.
sl@0
  1251
sl@0
  1252
Note: This deletes the data sink.
sl@0
  1253
sl@0
  1254
@since  7.0s
sl@0
  1255
*/
sl@0
  1256
EXPORT_C CMMFDataSinkHolder::~CMMFDataSinkHolder()
sl@0
  1257
	{
sl@0
  1258
	delete iDataSink;
sl@0
  1259
	}
sl@0
  1260
sl@0
  1261
/**
sl@0
  1262
Returns a reference to the data sink.
sl@0
  1263
sl@0
  1264
@return The data sink.
sl@0
  1265
@since 7.0s
sl@0
  1266
*/
sl@0
  1267
EXPORT_C MDataSink& CMMFDataSinkHolder::DataSink()
sl@0
  1268
	{
sl@0
  1269
	return *iDataSink;
sl@0
  1270
	}
sl@0
  1271
sl@0
  1272
/**
sl@0
  1273
Implementation of the pure virtual function inherited from CMMFObject.
sl@0
  1274
sl@0
  1275
Passes the request directly to the data sink.
sl@0
  1276
sl@0
  1277
@param  aMessage
sl@0
  1278
        The message to be handled.
sl@0
  1279
sl@0
  1280
@since  7.0s
sl@0
  1281
*/
sl@0
  1282
EXPORT_C void CMMFDataSinkHolder::HandleRequest(TMMFMessage& aMessage)
sl@0
  1283
	{
sl@0
  1284
	iDataSink->SinkCustomCommand(aMessage);
sl@0
  1285
	}
sl@0
  1286
sl@0
  1287
sl@0
  1288
// CMMFCustomCommandParserBase
sl@0
  1289
EXPORT_C TUid CMMFCustomCommandParserBase::InterfaceId()
sl@0
  1290
	{
sl@0
  1291
	return iInterfaceId;
sl@0
  1292
	}
sl@0
  1293
sl@0
  1294
EXPORT_C CMMFCustomCommandParserBase::~CMMFCustomCommandParserBase()
sl@0
  1295
	{
sl@0
  1296
	}
sl@0
  1297
sl@0
  1298
EXPORT_C CMMFCustomCommandParserBase::CMMFCustomCommandParserBase(TUid aInterfaceId)
sl@0
  1299
	: iInterfaceId(aInterfaceId)
sl@0
  1300
	{
sl@0
  1301
	}
sl@0
  1302
sl@0
  1303
sl@0
  1304
// CMMFObjectContainer
sl@0
  1305
sl@0
  1306
/**
sl@0
  1307
Constructor.
sl@0
  1308
sl@0
  1309
@since  7.0s
sl@0
  1310
*/
sl@0
  1311
EXPORT_C CMMFObjectContainer::CMMFObjectContainer()
sl@0
  1312
	{
sl@0
  1313
	iNextObjectHandle = KMMFObjectHandleFirstValid;
sl@0
  1314
	}
sl@0
  1315
sl@0
  1316
/**
sl@0
  1317
Destructor.
sl@0
  1318
sl@0
  1319
Deletes all objects owned by the container.
sl@0
  1320
sl@0
  1321
@since  7.0s
sl@0
  1322
*/
sl@0
  1323
EXPORT_C CMMFObjectContainer::~CMMFObjectContainer()
sl@0
  1324
	{
sl@0
  1325
	iObjects.ResetAndDestroy();
sl@0
  1326
	iObjects.Close();
sl@0
  1327
	}
sl@0
  1328
sl@0
  1329
/**
sl@0
  1330
Add an object to the container.
sl@0
  1331
sl@0
  1332
Once the object has been added, its ownership is transferred to the container.
sl@0
  1333
sl@0
  1334
@param  aObject
sl@0
  1335
        A reference to the object to be added to the container.
sl@0
  1336
sl@0
  1337
@return	An error code indicating if the function call was successful. If the return code is not KErrNone, then
sl@0
  1338
		ownership of the object still remains with the caller.
sl@0
  1339
@since  7.0s
sl@0
  1340
*/
sl@0
  1341
EXPORT_C TInt CMMFObjectContainer::AddMMFObject(CMMFObject& aObject)
sl@0
  1342
	{
sl@0
  1343
	// Check the object isn't already added
sl@0
  1344
	if (aObject.Handle().DestinationHandle() != KMMFObjectHandleNull)
sl@0
  1345
		return KErrAlreadyExists;
sl@0
  1346
sl@0
  1347
	TMMFMessageDestination newHandle(aObject.Handle().InterfaceId(), GenerateObjectHandle());
sl@0
  1348
	// Set the object's handle
sl@0
  1349
	aObject.SetHandle(newHandle);
sl@0
  1350
	// Append the object to the array
sl@0
  1351
	TInt error = iObjects.Append(&aObject);
sl@0
  1352
	// If error occurred, reset object handle to NULL
sl@0
  1353
	if (error)
sl@0
  1354
		{
sl@0
  1355
		TMMFMessageDestination evenNewerHandle(aObject.Handle().InterfaceId(), KMMFObjectHandleNull);
sl@0
  1356
		aObject.SetHandle(evenNewerHandle);
sl@0
  1357
		}
sl@0
  1358
	return error;
sl@0
  1359
	}
sl@0
  1360
sl@0
  1361
/**
sl@0
  1362
Removes and destroys an object from the container.
sl@0
  1363
sl@0
  1364
This method ensures that the object is no longer in the container, and that it gets deleted.
sl@0
  1365
Even if the object is not found in the container's array of objects, it will be deleted.
sl@0
  1366
sl@0
  1367
@param  aObject
sl@0
  1368
        A reference to the object to be deleted.
sl@0
  1369
sl@0
  1370
@since  7.0s
sl@0
  1371
*/
sl@0
  1372
EXPORT_C void CMMFObjectContainer::RemoveAndDestroyMMFObject(CMMFObject& aObject)
sl@0
  1373
	{
sl@0
  1374
	TInt positionOfObjectInArray;
sl@0
  1375
	TInt error = FindMMFObject(aObject, positionOfObjectInArray);
sl@0
  1376
	if (!error)
sl@0
  1377
		{
sl@0
  1378
		iObjects.Remove(positionOfObjectInArray);
sl@0
  1379
		}
sl@0
  1380
	//else, we don't care since we're just saying we'll make sure the object
sl@0
  1381
	//isn't in the array, and that it gets deleted.
sl@0
  1382
	delete (&aObject);
sl@0
  1383
	}
sl@0
  1384
sl@0
  1385
/**
sl@0
  1386
Removes and destroys all objects from the container.
sl@0
  1387
sl@0
  1388
@since	7.0s
sl@0
  1389
*/
sl@0
  1390
EXPORT_C void CMMFObjectContainer::DeleteAllObjects()
sl@0
  1391
	{
sl@0
  1392
	iObjects.ResetAndDestroy();
sl@0
  1393
	}
sl@0
  1394
sl@0
  1395
/**
sl@0
  1396
Finds an object in the container using a handle.
sl@0
  1397
sl@0
  1398
@param  aObjectHandle
sl@0
  1399
        The handle of the object to be located.
sl@0
  1400
@param  aObjectFound
sl@0
  1401
        A reference to a pointer to the object found in the container.
sl@0
  1402
sl@0
  1403
@return An error code indicating if the function call was successful. KErrNone on success, otherwise
sl@0
  1404
        another of the system-wide error codes.
sl@0
  1405
@since	7.0s
sl@0
  1406
*/
sl@0
  1407
EXPORT_C TInt CMMFObjectContainer::FindMMFObject(const TMMFMessageDestination& aObjectHandle, CMMFObject*& aObjectFound)
sl@0
  1408
	{
sl@0
  1409
	// Need to find the appropriate object in the array of CMMFObjects
sl@0
  1410
	TInt error = KErrNotFound;
sl@0
  1411
	for (TInt i=0; i<iObjects.Count(); i++)
sl@0
  1412
		{
sl@0
  1413
		CMMFObject* obj = iObjects[i];
sl@0
  1414
		if (obj->Handle() == aObjectHandle)
sl@0
  1415
			{
sl@0
  1416
			error = KErrNone;
sl@0
  1417
			aObjectFound = obj;
sl@0
  1418
			break;
sl@0
  1419
			}
sl@0
  1420
		}
sl@0
  1421
	return error;
sl@0
  1422
	}
sl@0
  1423
sl@0
  1424
const RPointerArray<CMMFObject>& CMMFObjectContainer::MMFObjects()
sl@0
  1425
	{
sl@0
  1426
	return iObjects;
sl@0
  1427
	}
sl@0
  1428
	
sl@0
  1429
TInt CMMFObjectContainer::FindMMFObject(const CMMFObject& aObject, TInt& aPositionInArray)
sl@0
  1430
	{
sl@0
  1431
	TInt error = KErrNotFound;
sl@0
  1432
	for (TInt i=0; i<iObjects.Count(); i++)
sl@0
  1433
		{
sl@0
  1434
		CMMFObject* obj = iObjects[i];
sl@0
  1435
		if (*obj == aObject)
sl@0
  1436
			{
sl@0
  1437
			error = KErrNone;
sl@0
  1438
			aPositionInArray = i;
sl@0
  1439
			break;
sl@0
  1440
			}
sl@0
  1441
		}
sl@0
  1442
	return error;
sl@0
  1443
	}
sl@0
  1444
sl@0
  1445
TInt CMMFObjectContainer::GenerateObjectHandle()
sl@0
  1446
	{
sl@0
  1447
	return iNextObjectHandle++;
sl@0
  1448
	}
sl@0
  1449
sl@0
  1450
sl@0
  1451
CLogonMonitor::CLogonMonitor(MLogonMonitorObserver* aLogonMonitorObserver) 
sl@0
  1452
: CActive(EPriorityStandard)
sl@0
  1453
	{
sl@0
  1454
	iLogonMonitorObserver = aLogonMonitorObserver;
sl@0
  1455
	}
sl@0
  1456
	
sl@0
  1457
void CLogonMonitor::ConstructL()
sl@0
  1458
	{
sl@0
  1459
	if (CActiveScheduler::Current()==0)
sl@0
  1460
		{
sl@0
  1461
		iScheduler = new (ELeave) CActiveScheduler;
sl@0
  1462
		CActiveScheduler::Install(iScheduler);
sl@0
  1463
		}
sl@0
  1464
		
sl@0
  1465
	CActiveScheduler::Add(this);
sl@0
  1466
	}
sl@0
  1467
	
sl@0
  1468
CLogonMonitor* CLogonMonitor::NewL(MLogonMonitorObserver* aLogonMonitorObserver)
sl@0
  1469
	{
sl@0
  1470
	CLogonMonitor* self = new (ELeave) CLogonMonitor(aLogonMonitorObserver);
sl@0
  1471
	CleanupStack::PushL(self);
sl@0
  1472
	self->ConstructL();
sl@0
  1473
	CleanupStack::Pop(self);
sl@0
  1474
	return self;
sl@0
  1475
	}
sl@0
  1476
sl@0
  1477
CLogonMonitor::~CLogonMonitor()
sl@0
  1478
	{
sl@0
  1479
	Cancel();
sl@0
  1480
	
sl@0
  1481
	if (iScheduler)
sl@0
  1482
		{
sl@0
  1483
		CActiveScheduler::Install(NULL);
sl@0
  1484
		delete iScheduler;
sl@0
  1485
		}
sl@0
  1486
	}
sl@0
  1487
sl@0
  1488
void CLogonMonitor::StartMonitoring(RThread& aThread)
sl@0
  1489
	{
sl@0
  1490
	ASSERT(!iThread);
sl@0
  1491
	
sl@0
  1492
	iThread = &aThread;
sl@0
  1493
	iThread->Logon(iStatus);
sl@0
  1494
	SetActive();
sl@0
  1495
	}
sl@0
  1496
sl@0
  1497
void CLogonMonitor::RunL()
sl@0
  1498
	{
sl@0
  1499
	iServer.Close();
sl@0
  1500
	iLogonMonitorObserver->ThreadTerminated();
sl@0
  1501
	}
sl@0
  1502
sl@0
  1503
void CLogonMonitor::DoCancel()
sl@0
  1504
	{
sl@0
  1505
	ASSERT(iThread);
sl@0
  1506
	
sl@0
  1507
	iThread->LogonCancel(iStatus);
sl@0
  1508
	iThread = NULL;
sl@0
  1509
	}
sl@0
  1510
sl@0
  1511
RServer2& CLogonMonitor::Server()
sl@0
  1512
	{
sl@0
  1513
	return iServer;
sl@0
  1514
	}
sl@0
  1515
	
sl@0
  1516
CMMFControllerExtendedData::CMMFControllerExtendedData()
sl@0
  1517
	: CMMFObject(KUidMMFControllerExtendedDataHolder), iSourceSinkInitData(NULL)
sl@0
  1518
	{
sl@0
  1519
	iClientThreadId = 0;
sl@0
  1520
	iSecureDrmMode = EFalse;
sl@0
  1521
	}
sl@0
  1522
sl@0
  1523
CMMFControllerExtendedData::~CMMFControllerExtendedData()
sl@0
  1524
	{
sl@0
  1525
	ResetSourceSinkInitData();
sl@0
  1526
	}
sl@0
  1527
	
sl@0
  1528
void CMMFControllerExtendedData::SetSourceSinkInitData(HBufC8* aSourceSinkInitData)
sl@0
  1529
	{
sl@0
  1530
	ResetSourceSinkInitData();
sl@0
  1531
	iSourceSinkInitData = aSourceSinkInitData;
sl@0
  1532
	}
sl@0
  1533
sl@0
  1534
HBufC8* CMMFControllerExtendedData::SourceSinkInitData() const
sl@0
  1535
	{
sl@0
  1536
	return iSourceSinkInitData;
sl@0
  1537
	}
sl@0
  1538
sl@0
  1539
void CMMFControllerExtendedData::ResetSourceSinkInitData()
sl@0
  1540
	{
sl@0
  1541
	if (iSourceSinkInitData)
sl@0
  1542
		{
sl@0
  1543
		delete iSourceSinkInitData;
sl@0
  1544
		iSourceSinkInitData = NULL;
sl@0
  1545
		}
sl@0
  1546
	}
sl@0
  1547
sl@0
  1548
void CMMFControllerExtendedData::SetClientThreadId(TThreadId aClientThreadId)
sl@0
  1549
	{
sl@0
  1550
	iClientThreadId = aClientThreadId;
sl@0
  1551
	}
sl@0
  1552
sl@0
  1553
TThreadId CMMFControllerExtendedData::ClientThreadId() const
sl@0
  1554
	{
sl@0
  1555
	return iClientThreadId;
sl@0
  1556
	}
sl@0
  1557
sl@0
  1558
void CMMFControllerExtendedData::SetSecureDrmMode(TBool aSecureDrmMode)
sl@0
  1559
	{
sl@0
  1560
	iSecureDrmMode = aSecureDrmMode;
sl@0
  1561
	}
sl@0
  1562
sl@0
  1563
TBool CMMFControllerExtendedData::SecureDrmMode() const
sl@0
  1564
	{
sl@0
  1565
	return iSecureDrmMode;
sl@0
  1566
	}
sl@0
  1567
sl@0
  1568
void CMMFControllerExtendedData::HandleRequest(TMMFMessage& /*aMessage*/)
sl@0
  1569
	{
sl@0
  1570
	// This function is not suppose to be called.
sl@0
  1571
#ifdef _DEBUG
sl@0
  1572
	Panic(EPanicBadInvariant);
sl@0
  1573
#endif
sl@0
  1574
	}
sl@0
  1575