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