os/ossrv/lowlevellibsandfws/apputils/bsul/test/t_clientmessage/t_clientmessagetestserver.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) 2008-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 "t_clientmessagetestserver.h"
sl@0
    17
sl@0
    18
sl@0
    19
_LIT(KServerName,"ClientMessageTestServer");
sl@0
    20
_LIT(KServer2Name,"SecondTestServer");
sl@0
    21
extern const BSUL::TClientMessageServerData KServerData;
sl@0
    22
extern const BSUL::TClientMessageServerData KServer2Data;
sl@0
    23
sl@0
    24
/* CClientMessageTestServer is a lightweight Server that is used to test
sl@0
    25
 * the CClientMessage framework.  Clientside code sends messages to the 
sl@0
    26
 * server which are processed and the client chceks the expected behaviour.
sl@0
    27
 * The server code does no testing itself.
sl@0
    28
 */
sl@0
    29
CServer2* CClientMessageTestServer::NewLC()
sl@0
    30
	{
sl@0
    31
	CClientMessageTestServer* self = new(ELeave) CClientMessageTestServer(CActive::EPriorityStandard);
sl@0
    32
	CleanupStack::PushL(self);
sl@0
    33
	self->ConstructL();
sl@0
    34
	return self;
sl@0
    35
	
sl@0
    36
	}
sl@0
    37
sl@0
    38
void CClientMessageTestServer::ConstructL()
sl@0
    39
	{
sl@0
    40
	BSUL::CClientMessage::InitialiseFrameworkL(KServerData);
sl@0
    41
	StartL(KServerName);
sl@0
    42
	}
sl@0
    43
sl@0
    44
TInt CClientMessageTestServer::RunError(TInt aError)
sl@0
    45
	{
sl@0
    46
	Message().Complete(aError);
sl@0
    47
	
sl@0
    48
	ReStart();
sl@0
    49
	return KErrNone;
sl@0
    50
	}
sl@0
    51
sl@0
    52
CClientMessageTestServer::CClientMessageTestServer(TInt aPriority):
sl@0
    53
		CServer2(aPriority)
sl@0
    54
	{	
sl@0
    55
	}
sl@0
    56
sl@0
    57
CSession2* CClientMessageTestServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const
sl@0
    58
	{
sl@0
    59
sl@0
    60
	return new(ELeave)CClientMessageTestSession;
sl@0
    61
	
sl@0
    62
	}
sl@0
    63
sl@0
    64
/* CClientMessageTestSession is a lightweight Session class processes
sl@0
    65
 * messages from the client using the CClientMessage framework 
sl@0
    66
 */
sl@0
    67
sl@0
    68
CClientMessageTestSession::~CClientMessageTestSession()
sl@0
    69
	{
sl@0
    70
	delete iClientMessage;
sl@0
    71
	}
sl@0
    72
sl@0
    73
void CClientMessageTestSession::CreateL(const CServer2& /*aServer*/)
sl@0
    74
	{
sl@0
    75
sl@0
    76
	}
sl@0
    77
sl@0
    78
sl@0
    79
void CClientMessageTestSession::ServiceL(const RMessage2& aMessage)
sl@0
    80
	{
sl@0
    81
	
sl@0
    82
	iClientMessage = BSUL::CClientMessage::NewL(aMessage);
sl@0
    83
	
sl@0
    84
	TRAPD(err, iClientMessage->ValidateL());
sl@0
    85
	if(err == KErrNone)
sl@0
    86
		{
sl@0
    87
		TRAP(err, DoServiceL());
sl@0
    88
		}
sl@0
    89
sl@0
    90
	iClientMessage->CompleteRequestL(err);
sl@0
    91
	
sl@0
    92
	delete iClientMessage;
sl@0
    93
	iClientMessage = NULL;
sl@0
    94
sl@0
    95
	}
sl@0
    96
sl@0
    97
void CClientMessageTestSession::DoServiceL()
sl@0
    98
	{
sl@0
    99
	
sl@0
   100
	
sl@0
   101
	switch(iClientMessage->Function())
sl@0
   102
		{
sl@0
   103
		case ETestMessage0:
sl@0
   104
		case ETestMessage21:
sl@0
   105
		case ETestMessage23:
sl@0
   106
			{
sl@0
   107
			TestFunction0L();
sl@0
   108
			break;
sl@0
   109
			}
sl@0
   110
			
sl@0
   111
		case ETestMessage1:
sl@0
   112
			{
sl@0
   113
			TestFunction1L();
sl@0
   114
			break;
sl@0
   115
			}
sl@0
   116
			
sl@0
   117
		case ETestMessage4:
sl@0
   118
			{
sl@0
   119
			TestFunction4L();
sl@0
   120
			break;
sl@0
   121
			}
sl@0
   122
			
sl@0
   123
		case ETestMessage5:
sl@0
   124
			{
sl@0
   125
			TestFunction5L();
sl@0
   126
			break;
sl@0
   127
			}
sl@0
   128
		
sl@0
   129
		case ETestMessage6:
sl@0
   130
			{
sl@0
   131
			TestFunction6L();
sl@0
   132
			break;
sl@0
   133
			}
sl@0
   134
			
sl@0
   135
		case ETestMessage7:
sl@0
   136
			{
sl@0
   137
			TestFunction7L();
sl@0
   138
			break;
sl@0
   139
			}
sl@0
   140
			
sl@0
   141
		case ETestMessage9:
sl@0
   142
			{
sl@0
   143
			TestFunction9L();
sl@0
   144
			break;
sl@0
   145
			}
sl@0
   146
			
sl@0
   147
		case ETestMessage10:
sl@0
   148
			{
sl@0
   149
			TestFunction10L();
sl@0
   150
			break;
sl@0
   151
			}
sl@0
   152
			
sl@0
   153
		case ETestMessage11:
sl@0
   154
			{
sl@0
   155
			TestFunction11L();
sl@0
   156
			break;
sl@0
   157
			}
sl@0
   158
			
sl@0
   159
		case ETestMessage14:
sl@0
   160
			{
sl@0
   161
			TestFunction14L();
sl@0
   162
			break;
sl@0
   163
			}
sl@0
   164
			
sl@0
   165
		case ETestMessage15:
sl@0
   166
			{
sl@0
   167
			TestFunction15L();
sl@0
   168
			break;
sl@0
   169
			}
sl@0
   170
			
sl@0
   171
		case ETestMessage16:
sl@0
   172
			{
sl@0
   173
			TestFunction16L();
sl@0
   174
			break;
sl@0
   175
			}
sl@0
   176
			
sl@0
   177
		case ETestMessage17:
sl@0
   178
			{
sl@0
   179
			TestFunction17L();
sl@0
   180
			break;
sl@0
   181
			}
sl@0
   182
			
sl@0
   183
		case ETestMessage18:
sl@0
   184
			{
sl@0
   185
			TestFunction18L();
sl@0
   186
			break;
sl@0
   187
			}
sl@0
   188
			
sl@0
   189
		case ETestMessage19:
sl@0
   190
			{
sl@0
   191
			TestFunction19L();
sl@0
   192
			break;
sl@0
   193
			}
sl@0
   194
			
sl@0
   195
		case ETestMessage31:
sl@0
   196
			{
sl@0
   197
			TestFunction31L();
sl@0
   198
			break;
sl@0
   199
			}
sl@0
   200
			
sl@0
   201
		//Just testing the validation of these functions.
sl@0
   202
		//No action to be taken
sl@0
   203
		case ETestMessage12:
sl@0
   204
		case ETestMessage13:
sl@0
   205
		case ETestMessage25:
sl@0
   206
		case ETestMessage26:
sl@0
   207
		case ETestMessage27:
sl@0
   208
		case ETestMessage28:
sl@0
   209
		case ETestMessage29:
sl@0
   210
		case ETestMessage30:
sl@0
   211
		case ETestMessage32:
sl@0
   212
			{
sl@0
   213
			break;
sl@0
   214
			}
sl@0
   215
			
sl@0
   216
		//This should never happen because these functions have been
sl@0
   217
		//incorrectly defined in the message schema and calling these
sl@0
   218
		//functions should result in a server panic when creating the
sl@0
   219
		//CClientMessage object using the message.		
sl@0
   220
		case ETestMessage2:
sl@0
   221
		case ETestMessage3:
sl@0
   222
		case ETestMessage8:
sl@0
   223
		//These messages should never be called as they have a failing security policy
sl@0
   224
		//for the client server
sl@0
   225
		case ETestMessage20:
sl@0
   226
		case ETestMessage22:
sl@0
   227
		case ETestMessage24:
sl@0
   228
			User::Panic(_L("ClientMessageTest"),0);
sl@0
   229
			break;
sl@0
   230
			
sl@0
   231
				
sl@0
   232
		}
sl@0
   233
	}
sl@0
   234
sl@0
   235
sl@0
   236
/*The test functions below read from or write to the 
sl@0
   237
 *clients message using the CCLientMessage framework.
sl@0
   238
 */
sl@0
   239
sl@0
   240
/*
sl@0
   241
 * Int value tests
sl@0
   242
 */
sl@0
   243
sl@0
   244
void CClientMessageTestSession::TestFunction0L()
sl@0
   245
	{	
sl@0
   246
	TInt arg0;
sl@0
   247
	TInt arg1;
sl@0
   248
	
sl@0
   249
	//Validate the first parameter
sl@0
   250
	iClientMessage->ValidateL(0);
sl@0
   251
	iClientMessage->ValidateL(1);
sl@0
   252
	
sl@0
   253
	TRAPD(err,iClientMessage->ValidateL(2));
sl@0
   254
	
sl@0
   255
	if(err != KErrArgument)
sl@0
   256
		{
sl@0
   257
		User::Leave(KErrGeneral);
sl@0
   258
		}
sl@0
   259
		
sl@0
   260
	//read the data from the clients message
sl@0
   261
	arg0 = iClientMessage->GetIntL(0);
sl@0
   262
	arg1 = iClientMessage->GetIntL(1);
sl@0
   263
	
sl@0
   264
	TRAP(err,iClientMessage->GetIntL(-1));
sl@0
   265
	
sl@0
   266
	if(err != KErrArgument)
sl@0
   267
		{
sl@0
   268
		User::Leave(KErrGeneral);
sl@0
   269
		}
sl@0
   270
	
sl@0
   271
	TRAP(err,iClientMessage->GetIntL(34));
sl@0
   272
	
sl@0
   273
	if(err != KErrArgument)
sl@0
   274
		{
sl@0
   275
		User::Leave(KErrGeneral);
sl@0
   276
		}
sl@0
   277
	
sl@0
   278
	//Just use the variables to remove compiler warnings
sl@0
   279
	arg0 += arg1;
sl@0
   280
	}
sl@0
   281
sl@0
   282
void CClientMessageTestSession::TestFunction1L()
sl@0
   283
	{
sl@0
   284
	TInt arg0;
sl@0
   285
	const TAny* ptr0;
sl@0
   286
	
sl@0
   287
	arg0 = iClientMessage->GetIntL(0);
sl@0
   288
	//Trying to read this argument for function 1 should fail as function 1
sl@0
   289
	//has been defined as having 2 int parameters
sl@0
   290
	ptr0 = iClientMessage->GetPtrL(1);	
sl@0
   291
	
sl@0
   292
	//Just use the variables to remove compiler warnings
sl@0
   293
	if(ptr0!= NULL)
sl@0
   294
		{
sl@0
   295
		arg0++;
sl@0
   296
		}
sl@0
   297
	}
sl@0
   298
sl@0
   299
sl@0
   300
/*
sl@0
   301
 * Read Only Descriptor tests
sl@0
   302
 */
sl@0
   303
sl@0
   304
void CClientMessageTestSession::TestFunction4L()
sl@0
   305
	{
sl@0
   306
	TBuf8<16> des8;
sl@0
   307
	TBuf<32> des16;
sl@0
   308
	
sl@0
   309
	//Read the data from the clients message
sl@0
   310
	iClientMessage->ReadL(0,des8);
sl@0
   311
	iClientMessage->ReadL(1,des16);
sl@0
   312
	}
sl@0
   313
sl@0
   314
void CClientMessageTestSession::TestFunction5L()
sl@0
   315
	{
sl@0
   316
	TBuf8<3> des8;
sl@0
   317
	TBuf<32> des16;
sl@0
   318
	
sl@0
   319
	//This buffer is not large enough to hold the client message
sl@0
   320
	//which has a defined length of 16.  Attempting to read into this should fail
sl@0
   321
	iClientMessage->ReadL(0,des8);
sl@0
   322
	iClientMessage->ReadL(1,des16);
sl@0
   323
	}
sl@0
   324
sl@0
   325
void CClientMessageTestSession::TestFunction6L()
sl@0
   326
	{
sl@0
   327
	TBuf8<16> des8;
sl@0
   328
	TBuf<32> des16;
sl@0
   329
	//This offset is negative. Attempting to read into this should fail
sl@0
   330
	iClientMessage->ReadL(0,des8,-1);
sl@0
   331
	iClientMessage->ReadL(1,des16);
sl@0
   332
	}
sl@0
   333
sl@0
   334
void CClientMessageTestSession::TestFunction7L()
sl@0
   335
	{
sl@0
   336
	TBuf8<16> des8;
sl@0
   337
	TBuf<32> des16;
sl@0
   338
	//This offset is towards the end of the string - should be ok
sl@0
   339
	//but only a partial string should be returned
sl@0
   340
	iClientMessage->ReadL(0,des8,7);
sl@0
   341
	iClientMessage->ReadL(1,des16);
sl@0
   342
	}
sl@0
   343
sl@0
   344
/*
sl@0
   345
 * Read\Write Descriptor tests
sl@0
   346
 */
sl@0
   347
sl@0
   348
void CClientMessageTestSession::TestFunction9L()
sl@0
   349
	{
sl@0
   350
	_LIT8(KDes8,"CClientMessageTest");
sl@0
   351
	_LIT(KDes,"CClientMessageTest");
sl@0
   352
	TInt offSet0;
sl@0
   353
	TInt offSet1;
sl@0
   354
	
sl@0
   355
	//Read in the offets
sl@0
   356
	offSet0 = iClientMessage->GetIntL(1);
sl@0
   357
	offSet1 = iClientMessage->GetIntL(3);
sl@0
   358
	
sl@0
   359
	//Write the data to the clients message at the given offset
sl@0
   360
	iClientMessage->WriteL(0,KDes8,offSet0);
sl@0
   361
	iClientMessage->WriteL(2,KDes,offSet1);
sl@0
   362
	}
sl@0
   363
sl@0
   364
void CClientMessageTestSession::TestFunction10L()
sl@0
   365
	{
sl@0
   366
	_LIT8(KDes8,"CClientMessageTest. This Descriptor is larger than the maximum allowed descriptor");
sl@0
   367
	_LIT(KDes,"CClientMessageTest");
sl@0
   368
	TInt offSet0;
sl@0
   369
	TInt offSet1;
sl@0
   370
	
sl@0
   371
	offSet0 = iClientMessage->GetIntL(1);
sl@0
   372
	offSet1 = iClientMessage->GetIntL(3);
sl@0
   373
	
sl@0
   374
	//Thi descriptor is too large and this should fail
sl@0
   375
	iClientMessage->WriteL(0,KDes8,offSet0);
sl@0
   376
	iClientMessage->WriteL(2,KDes,offSet1);
sl@0
   377
	}
sl@0
   378
sl@0
   379
void CClientMessageTestSession::TestFunction11L()
sl@0
   380
	{
sl@0
   381
	TBuf8<32> des8;
sl@0
   382
	TBuf<128> des16;
sl@0
   383
	
sl@0
   384
	//This buffer is not large enough to hold the client message
sl@0
   385
	//which has a defined length of 64.  
sl@0
   386
	//Attempting to read into this should fail on UDEB
sl@0
   387
	iClientMessage->ReadL(0,des8);
sl@0
   388
	iClientMessage->ReadL(2,des16);
sl@0
   389
	}
sl@0
   390
sl@0
   391
void CClientMessageTestSession::TestFunction14L()
sl@0
   392
	{
sl@0
   393
	TInt offSet;
sl@0
   394
	TBuf8<16> des8;
sl@0
   395
	
sl@0
   396
	offSet = iClientMessage->GetIntL(1);
sl@0
   397
	
sl@0
   398
	//Read the data from the clients descriptor using the offset provided
sl@0
   399
	TInt length = iClientMessage->GetDesLengthL(0);
sl@0
   400
	
sl@0
   401
	//Get a reference to the local copy of the descriptor
sl@0
   402
	const TDesC8& aDes = iClientMessage->GetDes8L(0);
sl@0
   403
	
sl@0
   404
	//Just do a comparison here to sure the variables and avoid compiler warnings
sl@0
   405
	if((length == aDes.Length()) && (length <= des8.MaxLength()))
sl@0
   406
		{
sl@0
   407
		iClientMessage->ReadL(0,des8,offSet);
sl@0
   408
		}
sl@0
   409
	
sl@0
   410
	//Write what was read back to the client
sl@0
   411
	iClientMessage->WriteL(2,des8);
sl@0
   412
	}
sl@0
   413
sl@0
   414
void CClientMessageTestSession::TestFunction15L()
sl@0
   415
	{
sl@0
   416
	TInt offSet;
sl@0
   417
	TBuf<16> des;
sl@0
   418
	
sl@0
   419
	offSet = iClientMessage->GetIntL(1);
sl@0
   420
	
sl@0
   421
	//read from the second descriptor
sl@0
   422
	TInt length = iClientMessage->GetDesLengthL(2);
sl@0
   423
	iClientMessage->ReadL(2,des,0);
sl@0
   424
	
sl@0
   425
	//Read the data from the clients descriptor using the offset provided
sl@0
   426
	length = iClientMessage->GetDesLengthL(0);
sl@0
   427
	
sl@0
   428
	//Get a reference to the local copy of the descriptor
sl@0
   429
	const TDesC& aDes = iClientMessage->GetDes16L(0);
sl@0
   430
	
sl@0
   431
	//Just do a comparison here to sure the variables and avoid compiler warnings
sl@0
   432
	if((length == aDes.Length()) && (length <= des.MaxLength()))
sl@0
   433
		{
sl@0
   434
		iClientMessage->ReadL(0,des,offSet);
sl@0
   435
		
sl@0
   436
		}
sl@0
   437
	//Write what was read back to the client
sl@0
   438
	if( length <= iClientMessage->GetDesMaxLengthL(2))
sl@0
   439
		{
sl@0
   440
		iClientMessage->WriteL(2,des);
sl@0
   441
		}
sl@0
   442
	}
sl@0
   443
sl@0
   444
/*
sl@0
   445
 * Ptr tests
sl@0
   446
 */
sl@0
   447
sl@0
   448
void CClientMessageTestSession::TestFunction16L()
sl@0
   449
	{
sl@0
   450
	const TAny* ptr;
sl@0
   451
	
sl@0
   452
	ptr = iClientMessage->GetPtrL(0);
sl@0
   453
	
sl@0
   454
	//Just use the variables to remove compiler warnings
sl@0
   455
	if(ptr != NULL)
sl@0
   456
		{
sl@0
   457
		ptr = NULL;
sl@0
   458
		}
sl@0
   459
sl@0
   460
	}
sl@0
   461
sl@0
   462
void CClientMessageTestSession::TestFunction17L()
sl@0
   463
	{	
sl@0
   464
	_LIT8(KDes8,"CClientMessageTest");
sl@0
   465
	
sl@0
   466
	//Ptr variables dont havea  WriteL method so this should panic
sl@0
   467
	iClientMessage->WriteL(0,KDes8);	
sl@0
   468
	}
sl@0
   469
sl@0
   470
/*
sl@0
   471
 * Pckg tests
sl@0
   472
 */
sl@0
   473
sl@0
   474
void CClientMessageTestSession::TestFunction18L()
sl@0
   475
	{	
sl@0
   476
	CMTestStruct2 struct1;
sl@0
   477
	TPckg<CMTestStruct2> pData(struct1);
sl@0
   478
	
sl@0
   479
	TInt length = iClientMessage->GetDesLengthL(0);
sl@0
   480
sl@0
   481
	iClientMessage->ReadL(0,pData);
sl@0
   482
sl@0
   483
	if(length == sizeof(CMTestStruct2))
sl@0
   484
		{
sl@0
   485
		struct1.iCount--;
sl@0
   486
		
sl@0
   487
		struct1.iDes = _L("Message Handled");
sl@0
   488
		
sl@0
   489
		length = iClientMessage->GetDesMaxLengthL(0);
sl@0
   490
		
sl@0
   491
		if(length == sizeof(CMTestStruct2))
sl@0
   492
			{
sl@0
   493
			iClientMessage->WriteL(0,pData);
sl@0
   494
			}
sl@0
   495
		}
sl@0
   496
	}
sl@0
   497
sl@0
   498
void CClientMessageTestSession::TestFunction19L()
sl@0
   499
	{
sl@0
   500
	CMTestStruct1 struct1;
sl@0
   501
	TPckg<CMTestStruct1> pData(struct1);
sl@0
   502
	
sl@0
   503
	iClientMessage->ReadL(0,pData);
sl@0
   504
	}
sl@0
   505
sl@0
   506
sl@0
   507
void CClientMessageTestSession::TestFunction31L()
sl@0
   508
	{
sl@0
   509
	TInt function = iClientMessage->GetIntL(0);
sl@0
   510
	
sl@0
   511
	switch(function)
sl@0
   512
		{
sl@0
   513
		case EGetIntL:
sl@0
   514
			{
sl@0
   515
			function = iClientMessage->GetIntL(1);
sl@0
   516
			break;
sl@0
   517
			}
sl@0
   518
			
sl@0
   519
		case EGetDes8L:
sl@0
   520
			{
sl@0
   521
			const TDesC8& data = iClientMessage->GetDes8L(1);
sl@0
   522
			break;
sl@0
   523
			}
sl@0
   524
			
sl@0
   525
		case ERead8L:
sl@0
   526
			{
sl@0
   527
			TBuf8<16> buf;
sl@0
   528
			iClientMessage->ReadL(1,buf);
sl@0
   529
			break;
sl@0
   530
			}
sl@0
   531
			
sl@0
   532
		case EWrite8L:
sl@0
   533
			{
sl@0
   534
			iClientMessage->WriteL(1, _L8(""));
sl@0
   535
			break;
sl@0
   536
			}
sl@0
   537
			
sl@0
   538
		case EGetDes16L:
sl@0
   539
			{
sl@0
   540
			const TDesC& data = iClientMessage->GetDes16L(1);
sl@0
   541
			break;
sl@0
   542
			}
sl@0
   543
			
sl@0
   544
		case ERead16L:
sl@0
   545
			{
sl@0
   546
			TBuf<16> buf;
sl@0
   547
			iClientMessage->ReadL(1,buf);
sl@0
   548
			break;
sl@0
   549
			}
sl@0
   550
			
sl@0
   551
		case EWrite16L:
sl@0
   552
			{
sl@0
   553
			iClientMessage->WriteL(1, _L(""));
sl@0
   554
			break;
sl@0
   555
			}
sl@0
   556
			
sl@0
   557
		case EGetDesLengthL:
sl@0
   558
			{
sl@0
   559
			function = iClientMessage->GetDesLengthL(1);
sl@0
   560
			break;
sl@0
   561
			}
sl@0
   562
			
sl@0
   563
		case EGetDesMaxLengthL:
sl@0
   564
			{
sl@0
   565
			function = iClientMessage->GetDesMaxLengthL(1);
sl@0
   566
			break;
sl@0
   567
			}
sl@0
   568
		}
sl@0
   569
	}
sl@0
   570
sl@0
   571
sl@0
   572
/* CClientMessageTestServer2 is a lightweight Server that is used to test
sl@0
   573
 * the CClientMessage framework.  Client side code sends messages to the 
sl@0
   574
 * server which are processed and the client chceks the expected behaviour.
sl@0
   575
 * The server code does no testing itself.  The second server is used to 
sl@0
   576
 * test the ClientMessage Frameworks handling of Tls data.
sl@0
   577
 */
sl@0
   578
CServer2* CClientMessageTestServer2::NewLC()
sl@0
   579
	{
sl@0
   580
	CClientMessageTestServer2* self = new(ELeave) CClientMessageTestServer2(CActive::EPriorityStandard);
sl@0
   581
	CleanupStack::PushL(self);
sl@0
   582
	self->ConstructL();
sl@0
   583
	return self;
sl@0
   584
	
sl@0
   585
	}
sl@0
   586
sl@0
   587
void CClientMessageTestServer2::ConstructL()
sl@0
   588
	{
sl@0
   589
	StartL(KServer2Name);
sl@0
   590
	}
sl@0
   591
sl@0
   592
TInt CClientMessageTestServer2::RunError(TInt aError)
sl@0
   593
	{
sl@0
   594
	Message().Complete(aError);
sl@0
   595
	
sl@0
   596
	ReStart();
sl@0
   597
	return KErrNone;
sl@0
   598
	}
sl@0
   599
sl@0
   600
CClientMessageTestServer2::CClientMessageTestServer2(TInt aPriority):
sl@0
   601
		CServer2(aPriority)
sl@0
   602
	{	
sl@0
   603
	
sl@0
   604
	}
sl@0
   605
sl@0
   606
CSession2* CClientMessageTestServer2::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const
sl@0
   607
	{
sl@0
   608
sl@0
   609
	return new(ELeave)CClientMessageTestSession2;
sl@0
   610
	
sl@0
   611
	}
sl@0
   612
sl@0
   613
/* CClientMessageTestSession2 is a lightweight Session class processes
sl@0
   614
 * messages from the client using the CClientMessage framework 
sl@0
   615
 */
sl@0
   616
sl@0
   617
CClientMessageTestSession2::~CClientMessageTestSession2()
sl@0
   618
	{
sl@0
   619
	delete iClientMessage;
sl@0
   620
	}
sl@0
   621
sl@0
   622
void CClientMessageTestSession2::CreateL(const CServer2& /*aServer*/)
sl@0
   623
	{
sl@0
   624
sl@0
   625
	}
sl@0
   626
sl@0
   627
sl@0
   628
void CClientMessageTestSession2::ServiceL(const RMessage2& aMessage)
sl@0
   629
	{
sl@0
   630
	
sl@0
   631
	TRAPD(err,iClientMessage = BSUL::CClientMessage::NewL(aMessage));
sl@0
   632
	
sl@0
   633
	if(err == BSUL::KErrNotInitialised)
sl@0
   634
		{
sl@0
   635
		BSUL::CClientMessage::InitialiseFrameworkL(KServer2Data);
sl@0
   636
		
sl@0
   637
		iClientMessage = BSUL::CClientMessage::NewL(aMessage);
sl@0
   638
		}
sl@0
   639
	
sl@0
   640
	TRAP(err, DoServiceL());
sl@0
   641
	
sl@0
   642
	iClientMessage->CompleteRequestL(err);
sl@0
   643
	
sl@0
   644
	delete iClientMessage;
sl@0
   645
	iClientMessage = NULL;
sl@0
   646
sl@0
   647
	}
sl@0
   648
sl@0
   649
void CClientMessageTestSession2::DoServiceL()
sl@0
   650
	{
sl@0
   651
	//Just do this to test the ::Message API
sl@0
   652
	const RMessage2& message = iClientMessage->Message();
sl@0
   653
	
sl@0
   654
	switch(message.Function())
sl@0
   655
		{
sl@0
   656
		case ETestMessage0:
sl@0
   657
			{
sl@0
   658
			TRAPD(err,TestFunction0L());
sl@0
   659
			if(err != BSUL::KErrNotValidated)
sl@0
   660
				{
sl@0
   661
				User::Leave(KErrGeneral);
sl@0
   662
				}
sl@0
   663
			iClientMessage->ValidateL();
sl@0
   664
sl@0
   665
			TestFunction0L();
sl@0
   666
sl@0
   667
			break;
sl@0
   668
			}
sl@0
   669
			
sl@0
   670
		case ETestMessage1:
sl@0
   671
			{
sl@0
   672
			TestFunction1L();
sl@0
   673
			break;
sl@0
   674
			}
sl@0
   675
			
sl@0
   676
		case ETestMessage2:
sl@0
   677
			{
sl@0
   678
			iClientMessage->ValidateL();
sl@0
   679
sl@0
   680
			TestFunction2L();
sl@0
   681
			break;
sl@0
   682
			}
sl@0
   683
			
sl@0
   684
		default:
sl@0
   685
			{
sl@0
   686
			User::Leave(KErrNotFound);
sl@0
   687
			break;
sl@0
   688
			}
sl@0
   689
sl@0
   690
		}
sl@0
   691
	}
sl@0
   692
sl@0
   693
/*The test function below reads from the clients message
sl@0
   694
 * using the CCLientMessage framework.
sl@0
   695
 */
sl@0
   696
sl@0
   697
void CClientMessageTestSession2::TestFunction0L()
sl@0
   698
	{	
sl@0
   699
	TInt arg0;
sl@0
   700
	TInt arg1;
sl@0
   701
	
sl@0
   702
	//read the data from the clients message
sl@0
   703
	arg0 = iClientMessage->GetIntL(0);
sl@0
   704
	arg1 = iClientMessage->GetIntL(1);
sl@0
   705
	
sl@0
   706
	//Just use the variables to remove compiler warnings
sl@0
   707
	arg0 += arg1;
sl@0
   708
	}
sl@0
   709
sl@0
   710
/*The test function below reads the int parameter from the message
sl@0
   711
 * The parameter is validated through a custom validation function
sl@0
   712
 */
sl@0
   713
sl@0
   714
void CClientMessageTestSession2::TestFunction1L()
sl@0
   715
	{	
sl@0
   716
	TInt arg0;
sl@0
   717
sl@0
   718
	iClientMessage->ValidateL(0);
sl@0
   719
		
sl@0
   720
	//read the data from the clients message
sl@0
   721
	arg0 = iClientMessage->GetIntL(0);
sl@0
   722
	
sl@0
   723
	arg0++;
sl@0
   724
	}
sl@0
   725
sl@0
   726
/*The test function below reads the descriptor from the clients message
sl@0
   727
 * The parameter is validated through a custom validation function
sl@0
   728
 */
sl@0
   729
void CClientMessageTestSession2::TestFunction2L()
sl@0
   730
	{	
sl@0
   731
	TBuf<32> data;
sl@0
   732
		
sl@0
   733
	//read the data from the clients message
sl@0
   734
	iClientMessage->ReadL(0,data,0);
sl@0
   735
sl@0
   736
	}
sl@0
   737
sl@0
   738
sl@0
   739
sl@0
   740
static void DoRunServer1L()
sl@0
   741
	{
sl@0
   742
	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
sl@0
   743
	CleanupStack::PushL(scheduler);
sl@0
   744
	CActiveScheduler::Install(scheduler);
sl@0
   745
sl@0
   746
	CServer2* server = CClientMessageTestServer::NewLC();
sl@0
   747
	
sl@0
   748
	TInt err = User::RenameThread(KServerName);
sl@0
   749
	
sl@0
   750
	RProcess().Rendezvous(KErrNone);
sl@0
   751
	
sl@0
   752
	CActiveScheduler::Start();
sl@0
   753
sl@0
   754
	CleanupStack::PopAndDestroy(server);
sl@0
   755
sl@0
   756
	CleanupStack::PopAndDestroy(scheduler);	
sl@0
   757
	}
sl@0
   758
sl@0
   759
static TInt RunServer1(TAny*)
sl@0
   760
	{
sl@0
   761
   	CTrapCleanup* cleanup=CTrapCleanup::New();
sl@0
   762
   	TInt r=KErrNoMemory;
sl@0
   763
   	if (cleanup)
sl@0
   764
   		{
sl@0
   765
 		TRAP(r,DoRunServer1L());
sl@0
   766
   		delete cleanup;
sl@0
   767
   		}
sl@0
   768
   	return r;
sl@0
   769
	}
sl@0
   770
sl@0
   771
static void DoRunServer2L()
sl@0
   772
	{
sl@0
   773
	CActiveScheduler* scheduler = new (ELeave) CActiveScheduler;
sl@0
   774
	CleanupStack::PushL(scheduler);
sl@0
   775
	CActiveScheduler::Install(scheduler);
sl@0
   776
sl@0
   777
	CServer2* server = CClientMessageTestServer2::NewLC();
sl@0
   778
	
sl@0
   779
	TInt err = User::RenameThread(KServer2Name);
sl@0
   780
	
sl@0
   781
	RProcess().Rendezvous(KErrNone);
sl@0
   782
	
sl@0
   783
	CActiveScheduler::Start();
sl@0
   784
sl@0
   785
	CleanupStack::PopAndDestroy(server);
sl@0
   786
sl@0
   787
	CleanupStack::PopAndDestroy(scheduler);	
sl@0
   788
	}
sl@0
   789
sl@0
   790
static TInt RunServer2(TAny*)
sl@0
   791
	{
sl@0
   792
   	CTrapCleanup* cleanup=CTrapCleanup::New();
sl@0
   793
   	TInt r=KErrNoMemory;
sl@0
   794
   	if (cleanup)
sl@0
   795
   		{
sl@0
   796
 		TRAP(r,DoRunServer2L());
sl@0
   797
   		delete cleanup;
sl@0
   798
   		}
sl@0
   799
   	return r;
sl@0
   800
	}
sl@0
   801
   	
sl@0
   802
/*Launch 2 servers in seperate threads to allow testing of ClientMessage Frameworks
sl@0
   803
 * Tls handling
sl@0
   804
 */
sl@0
   805
sl@0
   806
static void RunServersL()
sl@0
   807
	{
sl@0
   808
	
sl@0
   809
	RThread server1Thread;	
sl@0
   810
	TInt err = server1Thread.Create(_L("Test Server 1"), &RunServer1, KDefaultStackSize, NULL, NULL);
sl@0
   811
	
sl@0
   812
	if(err != KErrAlreadyExists)
sl@0
   813
		{
sl@0
   814
		User::LeaveIfError(err);
sl@0
   815
		}
sl@0
   816
	
sl@0
   817
	RThread server2Thread;	
sl@0
   818
	err = server2Thread.Create(_L("Test Server 2"), &RunServer2, KDefaultStackSize, NULL, NULL);	
sl@0
   819
	
sl@0
   820
	if(err != KErrAlreadyExists)
sl@0
   821
		{
sl@0
   822
		User::LeaveIfError(err);
sl@0
   823
		}
sl@0
   824
	
sl@0
   825
	server1Thread.Resume();
sl@0
   826
	
sl@0
   827
	TRequestStatus thread1Stat;
sl@0
   828
	server1Thread.Logon(thread1Stat);
sl@0
   829
sl@0
   830
	server2Thread.Resume();
sl@0
   831
	
sl@0
   832
	TRequestStatus thread2Stat;
sl@0
   833
	server2Thread.Logon(thread2Stat);
sl@0
   834
	
sl@0
   835
	User::WaitForRequest(thread1Stat,thread2Stat);
sl@0
   836
	
sl@0
   837
	if(server1Thread.ExitType() != EExitPending)
sl@0
   838
		{
sl@0
   839
		User::Panic(server1Thread.ExitCategory(),server1Thread.ExitReason());
sl@0
   840
		}
sl@0
   841
	
sl@0
   842
	else
sl@0
   843
		{
sl@0
   844
		User::Panic(server2Thread.ExitCategory(),server2Thread.ExitReason());
sl@0
   845
		}
sl@0
   846
	}
sl@0
   847
sl@0
   848
TInt E32Main()
sl@0
   849
   //
sl@0
   850
   // Server process entry-point
sl@0
   851
   //
sl@0
   852
   	{
sl@0
   853
   	CTrapCleanup* cleanup=CTrapCleanup::New();
sl@0
   854
   	TInt r=KErrNoMemory;
sl@0
   855
   	if (cleanup)
sl@0
   856
   		{
sl@0
   857
 		TRAP(r,RunServersL());
sl@0
   858
   		delete cleanup;
sl@0
   859
   		}
sl@0
   860
   	return r;
sl@0
   861
   	}
sl@0
   862
sl@0
   863
sl@0
   864
sl@0
   865
sl@0
   866
sl@0
   867
sl@0
   868
sl@0
   869
sl@0
   870
sl@0
   871
sl@0
   872
sl@0
   873
sl@0
   874
sl@0
   875
sl@0
   876
sl@0
   877
sl@0
   878