dbgagents/trkagent/tcbserver/TrkTcbSrvSession.cpp
author ravikurupati
Tue, 02 Mar 2010 10:33:16 +0530
changeset 0 c6b0df440bee
permissions -rw-r--r--
Initial contribution of EPL licensed sources

/*
* Copyright (c) 2009 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: 
*
*/

#include "TrkTcbSrvSession.h"

// System includes

//User Includes
#include "TrkTcbCmdCodes.h"
#include "TrkTcbSrvSessionEngine.h"
// Type definitions

// Constants
const TInt KTrkTcbServerTransferBufferExpandSize = 100;
const TInt KSlot0 = 0;
const TInt KSlot1 = 1;
//const TInt KSlot2 = 2;
const TInt KSlot3 = 3;

// Enumerations

// Classes referenced


//
// CTrkTcbSrvSession (source)
//

//
// CTrkTcbSrvServer::CTrkTcbSrvSession()
//
// Constructor
//
CTrkTcbSrvSession::CTrkTcbSrvSession()
{
}

//
// CTrkTcbSrvServer::~CTrkTcbSrvSession()
//
// Destructor
//
CTrkTcbSrvSession::~CTrkTcbSrvSession()
{
	HandleServerDestruction();
	delete iTransferBuffer;
}

//
// CTrkTcbSrvServer::ConstructL()
//
// Creates an instance of CTrkTcbSrvSession.
//
void CTrkTcbSrvSession::ConstructL()
{
	iTransferBuffer = CBufFlat::NewL(KTrkTcbServerTransferBufferExpandSize);
	iSessionEngine = CTrkTcbSrvSessionEngine::NewL();
}

//
// CTrkTcbSrvServer::NewL()
//
// Static self construction
//
CTrkTcbSrvSession* CTrkTcbSrvSession::NewL()
{
	CTrkTcbSrvSession* self = new(ELeave) CTrkTcbSrvSession();
	CleanupStack::PushL(self);
	self->ConstructL();
	CleanupStack::Pop(self);
	return self;
}

//
// CTrkTcbSrvServer::HandleServerDestruction()
//
// Called by the server's destructor. We need to be told that the server is
// being destroyed.
//
void CTrkTcbSrvSession::HandleServerDestruction()
{
	delete iSessionEngine;
	iSessionEngine = NULL;
}

//
// CTrkTcbSrvServer::ServiceL()
//
// Services requests from a client.
// Called by the IPC framework whenever a client sends a request to the server.
//
void CTrkTcbSrvSession::ServiceL(const RMessage2& aMessage)
{
	// Leave's are caught by CASSrvServer::RunError
	iMessage = &aMessage;
	
	const TBool completeMessage = DoServiceL();
	
	//Right now there are no asynchronous message completion.
	//So if the message is not completed, then there is an error and needs to be reported
	//to the client.
	if	(completeMessage)
		aMessage.Complete(KErrNone);
	else
		aMessage.Complete(KErrGeneral);
		
	iMessage=NULL;
}

//
// CTrkTcbSrvServer::ServiceL()
//
// Services the requests.
//
TBool CTrkTcbSrvSession::DoServiceL()
{
	TBool completeMessage = EFalse;
	const TInt cmd = Message().Function();
	//
	switch(cmd)
	{
		case ETrkTcbCmdCodeOpenFile:
			completeMessage = CmdOpenFileL();
			break;
		case ETrkTcbCmdCodeReadFile:
			completeMessage = CmdReadFileL();
			break;
		case ETrkTcbCmdCodeWriteFile:
			completeMessage = CmdWriteFileL();
			break;
		case ETrkTcbCmdCodeCloseFile:
			completeMessage = CmdCloseFileL();
			break;
		case ETrkTcbCmdCodePositionFile:
			completeMessage = CmdPositionFileL();
			break;
		case ETrkTcbCmdCodeShutDownServer:
			completeMessage = CmdShutDownServer();			
			break;
	
		default:
			Message().Panic(KServerIntiatedSessionPanic, ETrkTcbServerInitiatedClientPanicInvalidOperation);
			break;
	}
		
	return completeMessage;
}

//
// CTrkTcbSrvServer::CmdOpenFileL()
//
// Gets the data for open file request and calls the session engine open file method.
//
TBool CTrkTcbSrvSession::CmdOpenFileL()
{
	const TInt fileNameLength = static_cast<TInt>(Message().Int0());

	if (fileNameLength > 0)
	{
		HBufC* filePath = HBufC::NewLC(fileNameLength);
		TPtr pFilePath(filePath->Des());
		Message().ReadL(KSlot1, pFilePath);
	
		const TUint mode = static_cast<TUint>(Message().Int2());
		
		TTime modifiedTime;
		iSessionEngine->OpenFileL(filePath->Des(), mode, modifiedTime);
		
		TPckgC<TTime> package(modifiedTime);
		Message().WriteL(KSlot3, package);

		CleanupStack::PopAndDestroy(filePath);
		
		return ETrue;
	}
	return EFalse;
}

//
// CTrkTcbSrvServer::CmdReadFileL()
//
// Gets the data for read file request and calls the session engine read file method.
//
TBool CTrkTcbSrvSession::CmdReadFileL()
{
	const TInt dataLength = static_cast<TInt>(Message().Int0());
	
	if (dataLength > 0)
	{
		HBufC8* fileData = HBufC8::NewLC(dataLength);
		TPtr8 ptr(fileData->Des());
		
		iSessionEngine->ReadFileL(ptr);
		
		//write the file data into the client descriptor
		Message().WriteL(KSlot1, ptr);
	
		CleanupStack::PopAndDestroy(fileData);
	}

	return ETrue;
}

//
// CTrkTcbSrvServer::CmdWriteFileL()
//
// Gets the data for write file request and calls the session engine write file method.
//
TBool CTrkTcbSrvSession::CmdWriteFileL()
{
	const TInt fileDataLength = static_cast<TInt>(Message().Int0());
	
	if (fileDataLength > 0)
	{
		HBufC8* fileData = HBufC8::NewLC(fileDataLength);
		TPtr8 pFileData(fileData->Des());
		Message().ReadL(KSlot1, pFileData);
		
		iSessionEngine->WriteFileL(*fileData);

		CleanupStack::PopAndDestroy(fileData);
		
		return ETrue;
	}
	return EFalse;
}

//
// CTrkTcbSrvServer::CmdCloseFileL()
//
// Gets the data for close file request and calls the session engine close file method.
//
TBool CTrkTcbSrvSession::CmdCloseFileL()
{
	TTime modificationTime;
	
	TPckg<TTime> package(modificationTime);
	Message().ReadL(KSlot0, package);
	
	iSessionEngine->CloseFileL(modificationTime);
	
	return ETrue;
}

//
// CTrkTcbSrvServer::CmdPositionFileL()
//
// Gets the data for position file request and calls the session engine position file method.
//
TBool CTrkTcbSrvSession::CmdPositionFileL()
{
	TSeek seek;
	
	TPckg<TSeek> seekPckg(seek);
	Message().ReadL(KSlot0, seekPckg);
	
	TInt offset = static_cast<TInt>(Message().Int1());;

	iSessionEngine->PositionFileL(seek, offset);

	return ETrue;
}

//
// CTrkTcbSrvServer::CmdShutDownServer()
//
// Stops the active scheduler. This way, server process will run to completion.
//
TBool CTrkTcbSrvSession::CmdShutDownServer()
{
	CActiveScheduler::Stop();
	
	return ETrue;
}