commsprocess/commsrootserverconfig/TE_rootserver/testcpm/testcpm.cpp
author hgs
Mon, 06 Sep 2010 13:49:23 +0100
changeset 72 ae47d0499bee
permissions -rw-r--r--
201033_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
72
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     1
// Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies).
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     2
// All rights reserved.
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     7
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     8
// Initial Contributors:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    10
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    11
// Contributors:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    12
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    13
// Description:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    14
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    15
#include <cflog.h>
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    16
#include <cfshared.h>
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    17
using namespace CommsFW;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    18
#include <cfmsgs.h>
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    19
#include <rsshared.h>
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    20
#include "RootServerTest.h"
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    21
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    22
__CFLOG_STMT(_LIT8(KLogTestCPM, "TestCPM");) // subsystem name
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    23
_LIT( KTestCpmPanic, "TestCpm" );
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    24
const TText8* const KSubModules[] = { _S8("Test Protocol1"), _S8("Test Protocol2"), _S8("Test Protocol3") };
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    25
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    26
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    27
class CDeathTimer : public CTimer
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    28
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    29
public:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    30
	static CDeathTimer* NewL(TInt aAfter)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    31
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    32
		CDeathTimer* self = new(ELeave) CDeathTimer;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    33
		CleanupStack::PushL(self);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    34
		self->ConstructL();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    35
		CleanupStack::Pop(self);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    36
		CActiveScheduler::Add(self);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    37
		self->After(aAfter);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    38
		return self;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    39
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    40
protected:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    41
	CDeathTimer() : CTimer(EPriorityStandard)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    42
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    43
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    44
	void RunL()
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    45
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    46
		// Go not gracefully into that good night
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    47
		User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    48
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    49
	};
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    50
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    51
class CChannelHandler;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    52
class CTestModule : public CBase
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    53
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    54
public:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    55
	enum {EPriority=1000}; ///< priority of this Active Object
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    56
public:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    57
	~CTestModule();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    58
	void CFMessageReceived(TCFMessage& aMsg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    59
	static CTestModule* NewL(TCFModuleInfo* aStartupArgs);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    60
	void ConstructL(TCFModuleInfo* aStartupArgs);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    61
	void LoggedAfter(TInt aAfterMS, const TDesC8& aDescription);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    62
private:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    63
	CChannelHandler* iChannelHandler;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    64
	TTestModuleIniDataContainer iDelayTimes;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    65
	TInt iDiscoverPos;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    66
	CDeathTimer* iDeathTimer;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    67
	};
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    68
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    69
class CChannelHandler:public CActive
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    70
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    71
public:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    72
	static CChannelHandler* NewL(RCFChannel::TMsgQueues aRxQueues, 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    73
									RCFChannel::TMsgQueues aTxQueues, CTestModule* aModule);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    74
	void RunL();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    75
	TInt Send(TCFMessage);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    76
	~CChannelHandler();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    77
protected:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    78
	virtual void DoCancel();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    79
private:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    80
	void ConstructL(RCFChannel::TMsgQueues aRxQueues, 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    81
					RCFChannel::TMsgQueues aTxQueues, CTestModule* aModule);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    82
	CChannelHandler();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    83
private:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    84
	CTestModule* iModule;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    85
	RCFChannelPair iChannelPair;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    86
	};
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    87
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    88
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    89
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    90
// CChannelHandler class definitions
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    91
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    92
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    93
CChannelHandler::CChannelHandler():CActive(CActive::EPriorityStandard)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    94
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    95
	CActiveScheduler::Add(this);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    96
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    97
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    98
CChannelHandler* CChannelHandler::NewL(RCFChannel::TMsgQueues aRxQueues, 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
    99
									RCFChannel::TMsgQueues aTxQueues, CTestModule* aModule)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   100
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   101
	CChannelHandler* pHandler = new (ELeave) CChannelHandler;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   102
	pHandler->ConstructL(aRxQueues, aTxQueues, aModule);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   103
	return pHandler;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   104
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   105
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   106
void CChannelHandler::ConstructL(RCFChannel::TMsgQueues aRxQueues, 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   107
									RCFChannel::TMsgQueues aTxQueues, CTestModule* aModule)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   108
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   109
	iModule = aModule;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   110
	iChannelPair.CreateSend(aTxQueues);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   111
	iChannelPair.CreateRecv(aRxQueues);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   112
	SetActive();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   113
	iChannelPair.NotifyDataAvailable(*this);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   114
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   115
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   116
void CChannelHandler::DoCancel(void)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   117
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   118
	iChannelPair.CancelDataAvailable();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   119
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   120
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   121
TInt CChannelHandler::Send(TCFMessage aMsg)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   122
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   123
	TRequestStatus status;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   124
	iChannelPair.NotifySpaceAvailable(*this);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   125
	User::WaitForRequest(status);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   126
	return iChannelPair.Send(aMsg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   127
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   128
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   129
void CChannelHandler::RunL()
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   130
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   131
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   132
	if (iStatus != KErrNone)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   133
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   134
		User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   135
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   136
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   137
	// No error. Take the message from the channel.
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   138
	TCFMessage msg;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   139
	TInt err = iChannelPair.Receive(msg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   140
	if (KErrNone == err)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   141
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   142
		//Pass the message
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   143
		iModule->CFMessageReceived(msg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   144
		//Pend again
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   145
		SetActive();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   146
		iChannelPair.NotifyDataAvailable(*this);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   147
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   148
	else
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   149
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   150
		User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   151
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   152
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   153
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   154
CChannelHandler::~CChannelHandler()
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   155
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   156
	if(IsActive())
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   157
		Cancel();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   158
	iChannelPair.CloseNonGracefully();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   159
	}	
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   160
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   161
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   162
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   163
// implementation of CTestServer
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   164
//
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   165
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   166
CTestModule* CTestModule::NewL(TCFModuleInfo* aStartupArgs)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   167
/**
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   168
 * Create a new CCommServer.
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   169
 *
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   170
 * This is not a normal 2 phase contruction. If the allocation of the object
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   171
 * fails we will panic with -4 which means that something is very wrong.
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   172
 */
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   173
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   174
	CTestModule* pS;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   175
	CleanupStack::PushL(pS = new CTestModule);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   176
	__ASSERT_ALWAYS(pS!=NULL, User::Panic( KTestCpmPanic, KErrNoMemory));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   177
#ifdef SYMBIAN_C32ROOT_API_V3
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   178
	pS->ConstructL(aStartupArgs);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   179
#else
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   180
	TRAPD(r, pS->ConstructL(aStartupArgs));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   181
	__ASSERT_ALWAYS(r==KErrNone, User::Panic( KTestCpmPanic, KErrNoMemory));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   182
#endif
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   183
	CleanupStack::Pop(pS);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   184
	return pS;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   185
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   186
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   187
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   188
void CTestModule::ConstructL(TCFModuleInfo* aStartupArgs)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   189
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   190
	if (aStartupArgs->iIniData != NULL)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   191
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   192
		if (aStartupArgs->iIniData->Length() == sizeof(iDelayTimes))
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   193
			{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   194
			TTestModuleIniData pkg;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   195
			pkg.Copy(*(aStartupArgs->iIniData));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   196
#if defined(SYMBIAN_C32ROOT_API_V3)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   197
			delete aStartupArgs->iIniData;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   198
#endif
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   199
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   200
			iDelayTimes = pkg.iParams;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   201
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   202
			if(iDelayTimes.iInitDelay == EXIT_BEFORE_RENDEZVOUS)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   203
				User::Leave(KErrGeneral);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   204
			else if(iDelayTimes.iInitDelay > 0)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   205
				LoggedAfter(iDelayTimes.iInitDelay, _L8("Init"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   206
			else if(iDelayTimes.iInitDelay == PANIC_BEFORE_RENDEZVOUS)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   207
				User::Panic(_L("TESTCPM"), 1);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   208
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   209
			__CFLOG_5( KLogTestCPM, KLogCode, 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   210
				_L8("TestCpm[%LU] - iIniData delays (msec): discoveryDelay %d bindDelay %d unbindDelay %d shutdownDelay %d"), 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   211
						 RThread().Id().Id(), iDelayTimes.iDiscoveryDelay, iDelayTimes.iBindDelay,
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   212
						 iDelayTimes.iUnbindDelay, iDelayTimes.iShutdownDelay);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   213
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   214
			iChannelHandler = CChannelHandler::NewL(aStartupArgs->iRxQueues, aStartupArgs->iTxQueues, this);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   215
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   216
			RThread::Rendezvous(KErrNone);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   217
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   218
			if(iDelayTimes.iInitDelay == PANIC_AFTER_RENDEZVOUS)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   219
				User::Panic(_L("TESTCPM"), 1);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   220
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   221
			}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   222
		else
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   223
			{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   224
			__CFLOG_1( KLogTestCPM, KLogCode, _L("TestCpm[%LU] - iIniData mismatched"), RThread().Id().Id() );
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   225
#if defined(SYMBIAN_C32ROOT_API_V3)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   226
			delete aStartupArgs->iIniData;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   227
#endif
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   228
			ASSERT(0);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   229
			}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   230
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   231
	else
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   232
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   233
		__CFLOG_1( KLogTestCPM, KLogCode, _L("TestCpm[%LU] - No iIniData"), RThread().Id().Id() );
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   234
		ASSERT(0);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   235
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   236
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   237
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   238
void CTestModule::CFMessageReceived(TCFMessage& aMsg)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   239
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   240
	
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   241
	//It is called when a new message arrives from incomming channel
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   242
	switch (aMsg.Code())
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   243
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   244
		case TCFCommsMessage::ECodeDiscover:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   245
			{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   246
			// now wait for delay
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   247
			__CFLOG(KLogTestCPM, KLogCode, _L("TestCpm Discover message received"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   248
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   249
			LoggedAfter(iDelayTimes.iDiscoveryDelay, _L8("Discovery"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   250
			const TCFDiscoverMsg& msg = reinterpret_cast<const TCFDiscoverMsg&>(aMsg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   251
			// we return our sub-modules one at a time to make sure the RootServer copes with iterative discovery
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   252
			const TInt numSubModules = sizeof(KSubModules) / sizeof(KSubModules[0]);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   253
			ASSERT(msg.Size() > 0);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   254
			ASSERT(iDiscoverPos < numSubModules);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   255
			if(msg.Reset())
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   256
				iDiscoverPos = 0;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   257
			TCFSubModuleName name;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   258
			const TText8* subMod = KSubModules[iDiscoverPos++];
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   259
			name.Copy(subMod);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   260
			msg.SubModuleNames()[0] = name;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   261
			TBool discoveryEnded = (iDiscoverPos == numSubModules);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   262
			TCFDiscoverRespMsg diskresp(msg.Identifier(), 1, !discoveryEnded);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   263
			TInt err = iChannelHandler->Send(diskresp);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   264
			if(KErrNone != err)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   265
				{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   266
       		    User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   267
				}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   268
			if(discoveryEnded && iDelayTimes.iDeathDelay != NO_PREMATURE_DEATH)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   269
				{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   270
				TRAP(err, iDeathTimer = CDeathTimer::NewL(iDelayTimes.iDeathDelay * 1000));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   271
				ASSERT(iDeathTimer);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   272
				}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   273
				
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   274
			}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   275
			break;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   276
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   277
		case TCFCommsMessage::ECodeBind:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   278
			{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   279
			__CFLOG(KLogTestCPM, KLogCode, _L("TestCpm Bind message received"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   280
			// now wait for delay
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   281
			LoggedAfter(iDelayTimes.iBindDelay, _L8("Bind"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   282
			const TCFBindMsg& msg = reinterpret_cast<const TCFBindMsg&>(aMsg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   283
			TCFBindCompleteMsg resp(msg.Identifier(), KErrNone);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   284
			TInt err = iChannelHandler->Send(resp);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   285
			if(KErrNone != err)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   286
				{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   287
				User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   288
				}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   289
			}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   290
			break;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   291
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   292
		case TCFCommsMessage::ECodeUnbind: 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   293
			{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   294
			__CFLOG(KLogTestCPM, KLogCode, _L("TestCpm UnBind message received"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   295
			// now wait for delay
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   296
			LoggedAfter(iDelayTimes.iUnbindDelay, _L8("Unbind"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   297
			const TCFUnbindMsg& msg = reinterpret_cast<const TCFUnbindMsg&>(aMsg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   298
			TCFUnbindCompleteMsg resp(msg.Identifier(), KErrNone);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   299
			TInt err = iChannelHandler->Send(resp);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   300
			if(KErrNone != err)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   301
				{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   302
				User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   303
				}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   304
			}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   305
			break;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   306
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   307
		case TCFCommsMessage::ECodeShutdown:
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   308
			// now wait for delay
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   309
			__CFLOG(KLogTestCPM, KLogCode, _L("TestCpm Shutdown message received"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   310
			LoggedAfter(iDelayTimes.iShutdownDelay, _L8("Shutdown"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   311
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   312
			CActiveScheduler::Stop();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   313
			break;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   314
		default:;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   315
			User::Invariant();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   316
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   317
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   318
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   319
	
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   320
CTestModule::~CTestModule()
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   321
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   322
	delete iChannelHandler;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   323
	delete iDeathTimer;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   324
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   325
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   326
void CTestModule::LoggedAfter(TInt aAfterMS, const TDesC8& aDescription)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   327
	{ 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   328
	(void) aDescription;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   329
	__CFLOG_2(KLogTestCPM, KLogCode, _L8("TestCpm: %d ms %S pause"), aAfterMS, &aDescription);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   330
	User::After(aAfterMS * 1000);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   331
	__CFLOG_1(KLogTestCPM, KLogCode, _L8("TestCpm: %S pause complete"), &aDescription);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   332
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   333
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   334
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   335
//---------------
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   336
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   337
void DoModuleThreadL(TAny * aArg)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   338
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   339
	TCFModuleInfo* args = reinterpret_cast<TCFModuleInfo*>(aArg);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   340
	
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   341
	CActiveScheduler*  scheduler = new (ELeave) CActiveScheduler;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   342
	CleanupStack::PushL(scheduler);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   343
	CActiveScheduler::Install(scheduler); 
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   344
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   345
	CTestModule *pTm = CTestModule::NewL(args);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   346
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   347
    __CFLOG_1( KLogTestCPM, KLogCode, _L("TestCpm[%LU] - Completed rendezvous."), RThread().Id().Id() );
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   348
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   349
	CActiveScheduler::Start();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   350
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   351
	__CFLOG_1( KLogTestCPM, KLogCode, _L("TestCpm[%LU] - Exiting thread function"), RThread().Id().Id() );
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   352
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   353
	delete pTm;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   354
	CActiveScheduler::Install(NULL);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   355
	CleanupStack::PopAndDestroy(scheduler);
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   356
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   357
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   358
EXPORT_C TInt ModuleThread(TAny * aArg)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   359
	{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   360
	CTrapCleanup* cleanup = CTrapCleanup::New();
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   361
	if(!cleanup)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   362
		return KErrNoMemory;	
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   363
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   364
	TRAPD(ret, DoModuleThreadL(aArg))
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   365
	if (ret!=KErrNone)
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   366
		{
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   367
		__CFLOG(KLogTestCPM, KLogCode, _L("ModuleThread failed to create TestCpm"));
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   368
		}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   369
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   370
	delete cleanup;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   371
	return ret;
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   372
	}
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   373
ae47d0499bee 201033_02
hgs
parents:
diff changeset
   374