sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "t_clientmessagetestserver.h" sl@0: sl@0: sl@0: _LIT(KServerName,"ClientMessageTestServer"); sl@0: _LIT(KServer2Name,"SecondTestServer"); sl@0: extern const BSUL::TClientMessageServerData KServerData; sl@0: extern const BSUL::TClientMessageServerData KServer2Data; sl@0: sl@0: /* CClientMessageTestServer is a lightweight Server that is used to test sl@0: * the CClientMessage framework. Clientside code sends messages to the sl@0: * server which are processed and the client chceks the expected behaviour. sl@0: * The server code does no testing itself. sl@0: */ sl@0: CServer2* CClientMessageTestServer::NewLC() sl@0: { sl@0: CClientMessageTestServer* self = new(ELeave) CClientMessageTestServer(CActive::EPriorityStandard); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: return self; sl@0: sl@0: } sl@0: sl@0: void CClientMessageTestServer::ConstructL() sl@0: { sl@0: BSUL::CClientMessage::InitialiseFrameworkL(KServerData); sl@0: StartL(KServerName); sl@0: } sl@0: sl@0: TInt CClientMessageTestServer::RunError(TInt aError) sl@0: { sl@0: Message().Complete(aError); sl@0: sl@0: ReStart(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: CClientMessageTestServer::CClientMessageTestServer(TInt aPriority): sl@0: CServer2(aPriority) sl@0: { sl@0: } sl@0: sl@0: CSession2* CClientMessageTestServer::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const sl@0: { sl@0: sl@0: return new(ELeave)CClientMessageTestSession; sl@0: sl@0: } sl@0: sl@0: /* CClientMessageTestSession is a lightweight Session class processes sl@0: * messages from the client using the CClientMessage framework sl@0: */ sl@0: sl@0: CClientMessageTestSession::~CClientMessageTestSession() sl@0: { sl@0: delete iClientMessage; sl@0: } sl@0: sl@0: void CClientMessageTestSession::CreateL(const CServer2& /*aServer*/) sl@0: { sl@0: sl@0: } sl@0: sl@0: sl@0: void CClientMessageTestSession::ServiceL(const RMessage2& aMessage) sl@0: { sl@0: sl@0: iClientMessage = BSUL::CClientMessage::NewL(aMessage); sl@0: sl@0: TRAPD(err, iClientMessage->ValidateL()); sl@0: if(err == KErrNone) sl@0: { sl@0: TRAP(err, DoServiceL()); sl@0: } sl@0: sl@0: iClientMessage->CompleteRequestL(err); sl@0: sl@0: delete iClientMessage; sl@0: iClientMessage = NULL; sl@0: sl@0: } sl@0: sl@0: void CClientMessageTestSession::DoServiceL() sl@0: { sl@0: sl@0: sl@0: switch(iClientMessage->Function()) sl@0: { sl@0: case ETestMessage0: sl@0: case ETestMessage21: sl@0: case ETestMessage23: sl@0: { sl@0: TestFunction0L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage1: sl@0: { sl@0: TestFunction1L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage4: sl@0: { sl@0: TestFunction4L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage5: sl@0: { sl@0: TestFunction5L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage6: sl@0: { sl@0: TestFunction6L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage7: sl@0: { sl@0: TestFunction7L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage9: sl@0: { sl@0: TestFunction9L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage10: sl@0: { sl@0: TestFunction10L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage11: sl@0: { sl@0: TestFunction11L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage14: sl@0: { sl@0: TestFunction14L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage15: sl@0: { sl@0: TestFunction15L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage16: sl@0: { sl@0: TestFunction16L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage17: sl@0: { sl@0: TestFunction17L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage18: sl@0: { sl@0: TestFunction18L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage19: sl@0: { sl@0: TestFunction19L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage31: sl@0: { sl@0: TestFunction31L(); sl@0: break; sl@0: } sl@0: sl@0: //Just testing the validation of these functions. sl@0: //No action to be taken sl@0: case ETestMessage12: sl@0: case ETestMessage13: sl@0: case ETestMessage25: sl@0: case ETestMessage26: sl@0: case ETestMessage27: sl@0: case ETestMessage28: sl@0: case ETestMessage29: sl@0: case ETestMessage30: sl@0: case ETestMessage32: sl@0: { sl@0: break; sl@0: } sl@0: sl@0: //This should never happen because these functions have been sl@0: //incorrectly defined in the message schema and calling these sl@0: //functions should result in a server panic when creating the sl@0: //CClientMessage object using the message. sl@0: case ETestMessage2: sl@0: case ETestMessage3: sl@0: case ETestMessage8: sl@0: //These messages should never be called as they have a failing security policy sl@0: //for the client server sl@0: case ETestMessage20: sl@0: case ETestMessage22: sl@0: case ETestMessage24: sl@0: User::Panic(_L("ClientMessageTest"),0); sl@0: break; sl@0: sl@0: sl@0: } sl@0: } sl@0: sl@0: sl@0: /*The test functions below read from or write to the sl@0: *clients message using the CCLientMessage framework. sl@0: */ sl@0: sl@0: /* sl@0: * Int value tests sl@0: */ sl@0: sl@0: void CClientMessageTestSession::TestFunction0L() sl@0: { sl@0: TInt arg0; sl@0: TInt arg1; sl@0: sl@0: //Validate the first parameter sl@0: iClientMessage->ValidateL(0); sl@0: iClientMessage->ValidateL(1); sl@0: sl@0: TRAPD(err,iClientMessage->ValidateL(2)); sl@0: sl@0: if(err != KErrArgument) sl@0: { sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: //read the data from the clients message sl@0: arg0 = iClientMessage->GetIntL(0); sl@0: arg1 = iClientMessage->GetIntL(1); sl@0: sl@0: TRAP(err,iClientMessage->GetIntL(-1)); sl@0: sl@0: if(err != KErrArgument) sl@0: { sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: TRAP(err,iClientMessage->GetIntL(34)); sl@0: sl@0: if(err != KErrArgument) sl@0: { sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: sl@0: //Just use the variables to remove compiler warnings sl@0: arg0 += arg1; sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction1L() sl@0: { sl@0: TInt arg0; sl@0: const TAny* ptr0; sl@0: sl@0: arg0 = iClientMessage->GetIntL(0); sl@0: //Trying to read this argument for function 1 should fail as function 1 sl@0: //has been defined as having 2 int parameters sl@0: ptr0 = iClientMessage->GetPtrL(1); sl@0: sl@0: //Just use the variables to remove compiler warnings sl@0: if(ptr0!= NULL) sl@0: { sl@0: arg0++; sl@0: } sl@0: } sl@0: sl@0: sl@0: /* sl@0: * Read Only Descriptor tests sl@0: */ sl@0: sl@0: void CClientMessageTestSession::TestFunction4L() sl@0: { sl@0: TBuf8<16> des8; sl@0: TBuf<32> des16; sl@0: sl@0: //Read the data from the clients message sl@0: iClientMessage->ReadL(0,des8); sl@0: iClientMessage->ReadL(1,des16); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction5L() sl@0: { sl@0: TBuf8<3> des8; sl@0: TBuf<32> des16; sl@0: sl@0: //This buffer is not large enough to hold the client message sl@0: //which has a defined length of 16. Attempting to read into this should fail sl@0: iClientMessage->ReadL(0,des8); sl@0: iClientMessage->ReadL(1,des16); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction6L() sl@0: { sl@0: TBuf8<16> des8; sl@0: TBuf<32> des16; sl@0: //This offset is negative. Attempting to read into this should fail sl@0: iClientMessage->ReadL(0,des8,-1); sl@0: iClientMessage->ReadL(1,des16); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction7L() sl@0: { sl@0: TBuf8<16> des8; sl@0: TBuf<32> des16; sl@0: //This offset is towards the end of the string - should be ok sl@0: //but only a partial string should be returned sl@0: iClientMessage->ReadL(0,des8,7); sl@0: iClientMessage->ReadL(1,des16); sl@0: } sl@0: sl@0: /* sl@0: * Read\Write Descriptor tests sl@0: */ sl@0: sl@0: void CClientMessageTestSession::TestFunction9L() sl@0: { sl@0: _LIT8(KDes8,"CClientMessageTest"); sl@0: _LIT(KDes,"CClientMessageTest"); sl@0: TInt offSet0; sl@0: TInt offSet1; sl@0: sl@0: //Read in the offets sl@0: offSet0 = iClientMessage->GetIntL(1); sl@0: offSet1 = iClientMessage->GetIntL(3); sl@0: sl@0: //Write the data to the clients message at the given offset sl@0: iClientMessage->WriteL(0,KDes8,offSet0); sl@0: iClientMessage->WriteL(2,KDes,offSet1); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction10L() sl@0: { sl@0: _LIT8(KDes8,"CClientMessageTest. This Descriptor is larger than the maximum allowed descriptor"); sl@0: _LIT(KDes,"CClientMessageTest"); sl@0: TInt offSet0; sl@0: TInt offSet1; sl@0: sl@0: offSet0 = iClientMessage->GetIntL(1); sl@0: offSet1 = iClientMessage->GetIntL(3); sl@0: sl@0: //Thi descriptor is too large and this should fail sl@0: iClientMessage->WriteL(0,KDes8,offSet0); sl@0: iClientMessage->WriteL(2,KDes,offSet1); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction11L() sl@0: { sl@0: TBuf8<32> des8; sl@0: TBuf<128> des16; sl@0: sl@0: //This buffer is not large enough to hold the client message sl@0: //which has a defined length of 64. sl@0: //Attempting to read into this should fail on UDEB sl@0: iClientMessage->ReadL(0,des8); sl@0: iClientMessage->ReadL(2,des16); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction14L() sl@0: { sl@0: TInt offSet; sl@0: TBuf8<16> des8; sl@0: sl@0: offSet = iClientMessage->GetIntL(1); sl@0: sl@0: //Read the data from the clients descriptor using the offset provided sl@0: TInt length = iClientMessage->GetDesLengthL(0); sl@0: sl@0: //Get a reference to the local copy of the descriptor sl@0: const TDesC8& aDes = iClientMessage->GetDes8L(0); sl@0: sl@0: //Just do a comparison here to sure the variables and avoid compiler warnings sl@0: if((length == aDes.Length()) && (length <= des8.MaxLength())) sl@0: { sl@0: iClientMessage->ReadL(0,des8,offSet); sl@0: } sl@0: sl@0: //Write what was read back to the client sl@0: iClientMessage->WriteL(2,des8); sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction15L() sl@0: { sl@0: TInt offSet; sl@0: TBuf<16> des; sl@0: sl@0: offSet = iClientMessage->GetIntL(1); sl@0: sl@0: //read from the second descriptor sl@0: TInt length = iClientMessage->GetDesLengthL(2); sl@0: iClientMessage->ReadL(2,des,0); sl@0: sl@0: //Read the data from the clients descriptor using the offset provided sl@0: length = iClientMessage->GetDesLengthL(0); sl@0: sl@0: //Get a reference to the local copy of the descriptor sl@0: const TDesC& aDes = iClientMessage->GetDes16L(0); sl@0: sl@0: //Just do a comparison here to sure the variables and avoid compiler warnings sl@0: if((length == aDes.Length()) && (length <= des.MaxLength())) sl@0: { sl@0: iClientMessage->ReadL(0,des,offSet); sl@0: sl@0: } sl@0: //Write what was read back to the client sl@0: if( length <= iClientMessage->GetDesMaxLengthL(2)) sl@0: { sl@0: iClientMessage->WriteL(2,des); sl@0: } sl@0: } sl@0: sl@0: /* sl@0: * Ptr tests sl@0: */ sl@0: sl@0: void CClientMessageTestSession::TestFunction16L() sl@0: { sl@0: const TAny* ptr; sl@0: sl@0: ptr = iClientMessage->GetPtrL(0); sl@0: sl@0: //Just use the variables to remove compiler warnings sl@0: if(ptr != NULL) sl@0: { sl@0: ptr = NULL; sl@0: } sl@0: sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction17L() sl@0: { sl@0: _LIT8(KDes8,"CClientMessageTest"); sl@0: sl@0: //Ptr variables dont havea WriteL method so this should panic sl@0: iClientMessage->WriteL(0,KDes8); sl@0: } sl@0: sl@0: /* sl@0: * Pckg tests sl@0: */ sl@0: sl@0: void CClientMessageTestSession::TestFunction18L() sl@0: { sl@0: CMTestStruct2 struct1; sl@0: TPckg pData(struct1); sl@0: sl@0: TInt length = iClientMessage->GetDesLengthL(0); sl@0: sl@0: iClientMessage->ReadL(0,pData); sl@0: sl@0: if(length == sizeof(CMTestStruct2)) sl@0: { sl@0: struct1.iCount--; sl@0: sl@0: struct1.iDes = _L("Message Handled"); sl@0: sl@0: length = iClientMessage->GetDesMaxLengthL(0); sl@0: sl@0: if(length == sizeof(CMTestStruct2)) sl@0: { sl@0: iClientMessage->WriteL(0,pData); sl@0: } sl@0: } sl@0: } sl@0: sl@0: void CClientMessageTestSession::TestFunction19L() sl@0: { sl@0: CMTestStruct1 struct1; sl@0: TPckg pData(struct1); sl@0: sl@0: iClientMessage->ReadL(0,pData); sl@0: } sl@0: sl@0: sl@0: void CClientMessageTestSession::TestFunction31L() sl@0: { sl@0: TInt function = iClientMessage->GetIntL(0); sl@0: sl@0: switch(function) sl@0: { sl@0: case EGetIntL: sl@0: { sl@0: function = iClientMessage->GetIntL(1); sl@0: break; sl@0: } sl@0: sl@0: case EGetDes8L: sl@0: { sl@0: const TDesC8& data = iClientMessage->GetDes8L(1); sl@0: break; sl@0: } sl@0: sl@0: case ERead8L: sl@0: { sl@0: TBuf8<16> buf; sl@0: iClientMessage->ReadL(1,buf); sl@0: break; sl@0: } sl@0: sl@0: case EWrite8L: sl@0: { sl@0: iClientMessage->WriteL(1, _L8("")); sl@0: break; sl@0: } sl@0: sl@0: case EGetDes16L: sl@0: { sl@0: const TDesC& data = iClientMessage->GetDes16L(1); sl@0: break; sl@0: } sl@0: sl@0: case ERead16L: sl@0: { sl@0: TBuf<16> buf; sl@0: iClientMessage->ReadL(1,buf); sl@0: break; sl@0: } sl@0: sl@0: case EWrite16L: sl@0: { sl@0: iClientMessage->WriteL(1, _L("")); sl@0: break; sl@0: } sl@0: sl@0: case EGetDesLengthL: sl@0: { sl@0: function = iClientMessage->GetDesLengthL(1); sl@0: break; sl@0: } sl@0: sl@0: case EGetDesMaxLengthL: sl@0: { sl@0: function = iClientMessage->GetDesMaxLengthL(1); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: /* CClientMessageTestServer2 is a lightweight Server that is used to test sl@0: * the CClientMessage framework. Client side code sends messages to the sl@0: * server which are processed and the client chceks the expected behaviour. sl@0: * The server code does no testing itself. The second server is used to sl@0: * test the ClientMessage Frameworks handling of Tls data. sl@0: */ sl@0: CServer2* CClientMessageTestServer2::NewLC() sl@0: { sl@0: CClientMessageTestServer2* self = new(ELeave) CClientMessageTestServer2(CActive::EPriorityStandard); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: return self; sl@0: sl@0: } sl@0: sl@0: void CClientMessageTestServer2::ConstructL() sl@0: { sl@0: StartL(KServer2Name); sl@0: } sl@0: sl@0: TInt CClientMessageTestServer2::RunError(TInt aError) sl@0: { sl@0: Message().Complete(aError); sl@0: sl@0: ReStart(); sl@0: return KErrNone; sl@0: } sl@0: sl@0: CClientMessageTestServer2::CClientMessageTestServer2(TInt aPriority): sl@0: CServer2(aPriority) sl@0: { sl@0: sl@0: } sl@0: sl@0: CSession2* CClientMessageTestServer2::NewSessionL(const TVersion& /*aVersion*/, const RMessage2& /*aMessage*/) const sl@0: { sl@0: sl@0: return new(ELeave)CClientMessageTestSession2; sl@0: sl@0: } sl@0: sl@0: /* CClientMessageTestSession2 is a lightweight Session class processes sl@0: * messages from the client using the CClientMessage framework sl@0: */ sl@0: sl@0: CClientMessageTestSession2::~CClientMessageTestSession2() sl@0: { sl@0: delete iClientMessage; sl@0: } sl@0: sl@0: void CClientMessageTestSession2::CreateL(const CServer2& /*aServer*/) sl@0: { sl@0: sl@0: } sl@0: sl@0: sl@0: void CClientMessageTestSession2::ServiceL(const RMessage2& aMessage) sl@0: { sl@0: sl@0: TRAPD(err,iClientMessage = BSUL::CClientMessage::NewL(aMessage)); sl@0: sl@0: if(err == BSUL::KErrNotInitialised) sl@0: { sl@0: BSUL::CClientMessage::InitialiseFrameworkL(KServer2Data); sl@0: sl@0: iClientMessage = BSUL::CClientMessage::NewL(aMessage); sl@0: } sl@0: sl@0: TRAP(err, DoServiceL()); sl@0: sl@0: iClientMessage->CompleteRequestL(err); sl@0: sl@0: delete iClientMessage; sl@0: iClientMessage = NULL; sl@0: sl@0: } sl@0: sl@0: void CClientMessageTestSession2::DoServiceL() sl@0: { sl@0: //Just do this to test the ::Message API sl@0: const RMessage2& message = iClientMessage->Message(); sl@0: sl@0: switch(message.Function()) sl@0: { sl@0: case ETestMessage0: sl@0: { sl@0: TRAPD(err,TestFunction0L()); sl@0: if(err != BSUL::KErrNotValidated) sl@0: { sl@0: User::Leave(KErrGeneral); sl@0: } sl@0: iClientMessage->ValidateL(); sl@0: sl@0: TestFunction0L(); sl@0: sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage1: sl@0: { sl@0: TestFunction1L(); sl@0: break; sl@0: } sl@0: sl@0: case ETestMessage2: sl@0: { sl@0: iClientMessage->ValidateL(); sl@0: sl@0: TestFunction2L(); sl@0: break; sl@0: } sl@0: sl@0: default: sl@0: { sl@0: User::Leave(KErrNotFound); sl@0: break; sl@0: } sl@0: sl@0: } sl@0: } sl@0: sl@0: /*The test function below reads from the clients message sl@0: * using the CCLientMessage framework. sl@0: */ sl@0: sl@0: void CClientMessageTestSession2::TestFunction0L() sl@0: { sl@0: TInt arg0; sl@0: TInt arg1; sl@0: sl@0: //read the data from the clients message sl@0: arg0 = iClientMessage->GetIntL(0); sl@0: arg1 = iClientMessage->GetIntL(1); sl@0: sl@0: //Just use the variables to remove compiler warnings sl@0: arg0 += arg1; sl@0: } sl@0: sl@0: /*The test function below reads the int parameter from the message sl@0: * The parameter is validated through a custom validation function sl@0: */ sl@0: sl@0: void CClientMessageTestSession2::TestFunction1L() sl@0: { sl@0: TInt arg0; sl@0: sl@0: iClientMessage->ValidateL(0); sl@0: sl@0: //read the data from the clients message sl@0: arg0 = iClientMessage->GetIntL(0); sl@0: sl@0: arg0++; sl@0: } sl@0: sl@0: /*The test function below reads the descriptor from the clients message sl@0: * The parameter is validated through a custom validation function sl@0: */ sl@0: void CClientMessageTestSession2::TestFunction2L() sl@0: { sl@0: TBuf<32> data; sl@0: sl@0: //read the data from the clients message sl@0: iClientMessage->ReadL(0,data,0); sl@0: sl@0: } sl@0: sl@0: sl@0: sl@0: static void DoRunServer1L() sl@0: { sl@0: CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; sl@0: CleanupStack::PushL(scheduler); sl@0: CActiveScheduler::Install(scheduler); sl@0: sl@0: CServer2* server = CClientMessageTestServer::NewLC(); sl@0: sl@0: TInt err = User::RenameThread(KServerName); sl@0: sl@0: RProcess().Rendezvous(KErrNone); sl@0: sl@0: CActiveScheduler::Start(); sl@0: sl@0: CleanupStack::PopAndDestroy(server); sl@0: sl@0: CleanupStack::PopAndDestroy(scheduler); sl@0: } sl@0: sl@0: static TInt RunServer1(TAny*) sl@0: { sl@0: CTrapCleanup* cleanup=CTrapCleanup::New(); sl@0: TInt r=KErrNoMemory; sl@0: if (cleanup) sl@0: { sl@0: TRAP(r,DoRunServer1L()); sl@0: delete cleanup; sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: static void DoRunServer2L() sl@0: { sl@0: CActiveScheduler* scheduler = new (ELeave) CActiveScheduler; sl@0: CleanupStack::PushL(scheduler); sl@0: CActiveScheduler::Install(scheduler); sl@0: sl@0: CServer2* server = CClientMessageTestServer2::NewLC(); sl@0: sl@0: TInt err = User::RenameThread(KServer2Name); sl@0: sl@0: RProcess().Rendezvous(KErrNone); sl@0: sl@0: CActiveScheduler::Start(); sl@0: sl@0: CleanupStack::PopAndDestroy(server); sl@0: sl@0: CleanupStack::PopAndDestroy(scheduler); sl@0: } sl@0: sl@0: static TInt RunServer2(TAny*) sl@0: { sl@0: CTrapCleanup* cleanup=CTrapCleanup::New(); sl@0: TInt r=KErrNoMemory; sl@0: if (cleanup) sl@0: { sl@0: TRAP(r,DoRunServer2L()); sl@0: delete cleanup; sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: /*Launch 2 servers in seperate threads to allow testing of ClientMessage Frameworks sl@0: * Tls handling sl@0: */ sl@0: sl@0: static void RunServersL() sl@0: { sl@0: sl@0: RThread server1Thread; sl@0: TInt err = server1Thread.Create(_L("Test Server 1"), &RunServer1, KDefaultStackSize, NULL, NULL); sl@0: sl@0: if(err != KErrAlreadyExists) sl@0: { sl@0: User::LeaveIfError(err); sl@0: } sl@0: sl@0: RThread server2Thread; sl@0: err = server2Thread.Create(_L("Test Server 2"), &RunServer2, KDefaultStackSize, NULL, NULL); sl@0: sl@0: if(err != KErrAlreadyExists) sl@0: { sl@0: User::LeaveIfError(err); sl@0: } sl@0: sl@0: server1Thread.Resume(); sl@0: sl@0: TRequestStatus thread1Stat; sl@0: server1Thread.Logon(thread1Stat); sl@0: sl@0: server2Thread.Resume(); sl@0: sl@0: TRequestStatus thread2Stat; sl@0: server2Thread.Logon(thread2Stat); sl@0: sl@0: User::WaitForRequest(thread1Stat,thread2Stat); sl@0: sl@0: if(server1Thread.ExitType() != EExitPending) sl@0: { sl@0: User::Panic(server1Thread.ExitCategory(),server1Thread.ExitReason()); sl@0: } sl@0: sl@0: else sl@0: { sl@0: User::Panic(server2Thread.ExitCategory(),server2Thread.ExitReason()); sl@0: } sl@0: } sl@0: sl@0: TInt E32Main() sl@0: // sl@0: // Server process entry-point sl@0: // sl@0: { sl@0: CTrapCleanup* cleanup=CTrapCleanup::New(); sl@0: TInt r=KErrNoMemory; sl@0: if (cleanup) sl@0: { sl@0: TRAP(r,RunServersL()); sl@0: delete cleanup; sl@0: } sl@0: return r; sl@0: } sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: sl@0: