mmtestenv/mmtestfw/Source/TestFrameworkClient/testfwclientsession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 13:56:28 +0300
changeset 15 c1e808730d6c
permissions -rw-r--r--
Revision: 201018 Kit: 201018

// Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Client / server logging for Test Framework
// NOTE : does NOT include secure API changes in EKA2
// 
//


// Test system includes
#include <testframework.h>

/**
 *
 * Global : start a server
 * NOTE. Function is global static as only one server will ever run at any time
 * (there may be multiple client sessions)
 *
 * @return	"TInt"
 *			Error code (KErrNone if successful)
 *
 * @xxxx
 *
 */
GLDEF_C TInt StartServer()
// Start the server process/thread which lives in an (EPOC)EXE object
	{
	const TUidType serverUid(KNullUid, KNullUid, KTestFrameworkServerUid3);


// EPOC is easy, we just create a new server process. Simultaneous launching
// of two such processes should be detected when the second one attempts to
// create the server object, failing with KErrAlreadyExists.

	RProcess server;
	TInt r = server.Create(KTestFrameworkServerImg, KNullDesC, serverUid);

	if (r != KErrNone)
		return r;

	
	TRequestStatus rendezvous;
	server.Rendezvous(rendezvous);

	if (rendezvous!=KRequestPending)
		{
		server.Kill(0);
		}
	else
		{
		server.Resume();
		}


	User::WaitForRequest(rendezvous);		// wait for start or death

	// we can't use the 'exit reason' if the server panicked as this
	// is the panic 'reason' and may be '0' which cannot be distinguished
	// from KErrNone
	if (rendezvous!=KErrNone)
		{
		server.Close();
		}

	// server started (at last). Cancel and consume the death-notification
	// before reporting success
	return rendezvous.Int();
	}

/**
 *
 * Constructor for RTestFrameworkClientSession
 *
 * @xxxx
 *
 */
RTestFrameworkClientSession::RTestFrameworkClientSession()
	{
	}

/**
 *
 * Client session : connect to server.
 * Will start a new server session if no server exists
 *
 * @return	"TInt"
 *			Error code (KErrNone if connect successful)
 *
 * @xxxx
 *
 */
TInt RTestFrameworkClientSession::Connect()
	{
	// NOTE : this loop is ugly and can probably be rewritten to be more graceful
	const TInt KNumRetries = 2;

	TInt retry = KNumRetries;
	for (;;)
		{
		TInt r = CreateSession(KTestFrameworkServerName, TVersion(KTestFrameworkServerMajorVersionNumber,
																  KTestFrameworkServerMinorVersionNumber,
																  KTestFrameworkServerBuildVersionNumber));
		if (r == KErrNone)
			{
#ifdef __IPC_V2_PRESENT__
			r = ShareAuto();
#else
			r = Share(RSessionBase::EAutoAttach);
#endif
			if (r!=KErrNone)
				Close();
			return r;
			}
		if (r != KErrNotFound && r != KErrServerTerminated)
			{
			return r;
			}
		if (--retry == 0)
			return r;
		r = StartServer();
		if (r != KErrNone && r != KErrAlreadyExists)
			return r;
		}
	}

/**
 *
 * Request creation of an input window.
 * NOTE. For initialisation of input console only - unlikely to
 * be required by user
 *
 * @param	"TRectBuf& aAllocatedWindow"
 *			Window dimensions
 *
 * @param	"TRequestStatus& aReqStat"
 *			Request status
 *
 * @xxxx
 *
 */
void RTestFrameworkClientSession::CreateInputWindow(TRectBuf& aAllocatedWindow, TRequestStatus& aReqStat)
	{
	SendReceiveResult(ECreateInputWindow, aAllocatedWindow, aReqStat);
	}

/**
 *
 * Request window change notifications
 * NOTE. For initialisation of input console only - unlikely to
 * be required by user
 *
 * @param	"TRectBuf& aNewWindow"
 *			New window dimensions
 *
 * @param	"TRequestStatus& aReqStat"
 *			Request status
 *
 * @xxxx
 *
 */
void RTestFrameworkClientSession::NotifyIfWindowChange(TRectBuf& aNewWindow, TRequestStatus& aReqStat)
	{
	SendReceiveResult(ENotifyIfWindowChange, aNewWindow, aReqStat);
	}

/**
 *
 * Cancel window change notifications
 * NOTE. For initialisation of input console only - unlikely to
 * be required by user
 *
 * @return	"TInt"
 *			SendReceive error code
 *
 * @xxxx
 *
 */
TInt RTestFrameworkClientSession::CancelNotifyIfWindowChange()
	{
	return SendReceive(ECancelNotifyIfWindowChange);
	}


/**
 *
 * Open a log server session
 *
 * @param	"const TDesC& aLogName"
 *			The log name
 *
 * @param	"TInt aLogMode"
 *			The log mode (a bitmask of TTestFrameworkLogMode)
 *
 * @xxxx
 *
 */
void RTestFrameworkClientSession::OpenLog(const TDesC& aLogName, TInt aLogMode)
	{
	(void) SendReceive(EOpenLog, aLogName, aLogMode);
	}

/**
 *
 * Write message string to log server session
 *
 * @param	"const TDesC& aMsg"
 *			The message string
 *
 * @param	"TInt aLogMode"
 *			The log mode (a bitmask of TTestFrameworkLogMode)
 *
 * @xxxx
 *
 */
void RTestFrameworkClientSession::WriteLog(const TDesC& aMsg, TInt aLogMode)
	{
	(void) SendReceive(EWriteLog, aMsg, aLogMode);
	}

/**
 *
 * Send close log message to server
 *
 * @xxxx
 *
 */
void RTestFrameworkClientSession::CloseLog()
	{
	SendReceive(ECloseLog);
	}

/**
 *
 * Retrieve log status from server
 *
 * @return	"TInt"
 *			The log status (a bitmask of TTestFrameworkLogMode)
 *
 * @xxxx
 *
 */
TInt RTestFrameworkClientSession::LogStatus()
	{
	TInt res = 0;
	TPckgBuf<TInt> pckg;
	TInt r = SendReceiveResult(ELogStatus, pckg);
	if (r != KErrNone)
	{
		// RTestFrameworkClientSession does not log - 
		// we can however return 0 to indicate an error (no outputs)
		res = 0;
	}
	else
		res = pckg();
	return res;
	}