pimprotocols/pbap/server/pbapsession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:17 +0200
changeset 0 e686773b3f54
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// Copyright (c) 2006-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 <s32mem.h>
#include <e32svr.h>

#include "pbapsession.h"
#include "clientserver.h"
#include "pbapserver.h"

#include "btaccesshostlog.h"



CPbapSession::CPbapSession()
	{
	LOG_FUNC
	}
	
/**
 Second phase constructor for sessions. Called by the CServer2 framework
 when a session is created (e.g. a connection is made to the server).
 */
void CPbapSession::CreateL()
	{
	LOG_FUNC
	Server().AddSession();
	}

/**
 Destructor for session classes. When this is called it indicates that
 a session is closing its connection with the server.
 */
CPbapSession::~CPbapSession()
	{
	LOG_FUNC
	Server().DropSession();
	}


CPbapServer& CPbapSession::Server()
	{
	LOG_FUNC
	return *static_cast<CPbapServer*>(const_cast<CServer2*>(CSession2::Server()));
	}

/**
 Handle message requests for this session. Leaving is handled by
 CPbapSession::ServiceError() which reports the error code to the client.
 */
void CPbapSession::ServiceL(const RMessage2 &aMessage)
	{
	LOG_FUNC
	switch (aMessage.Function())
		{
		case EPbapStartListening:
			{
			Server().StartObexL();
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		case EPbapStopListening:
			{
			Server().ReleaseObex();
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		case EPbapSetPassword:
			{
			HBufC* password = HBufC::NewLC(aMessage.GetDesLengthL(0));
			TPtr passwordPtr(password->Des());
			aMessage.ReadL(0, passwordPtr);
			Server().SetPasswordL(password);	// ownership passed
			CleanupStack::Pop(password);
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		case EPbapDbgMarkHeap:
			{
			#ifdef _DEBUG
			__UHEAP_MARK;
			#endif
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		case EPbapDbgCheckHeap:
			{
			#ifdef _DEBUG
			__UHEAP_CHECK(aMessage.Int0());
			#endif
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		case EPbapDbgMarkEnd:
			{
			#ifdef _DEBUG
			__UHEAP_MARKENDC(aMessage.Int0());
			#endif 
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		case EPbapDbgFailNext:
			{
			#ifdef _DEBUG
			if (aMessage.Int0() == 0)
				{
				__UHEAP_RESET;
				}
			else
				{
				__UHEAP_FAILNEXT(aMessage.Int0());
				}
			#endif
			CompleteRequest(aMessage, KErrNone);
			}
			break;
		default:
			// panic the client
			aMessage.Panic(KPbapServerPanic, EPbapServerPanicIllegalFunction);
			break;
		}
	}

/**
 Completes a client request. This function provides a single point of
 message completion which benefits debugging and maintenance.
 */
void CPbapSession::CompleteRequest(const RMessage2& aMessage, TInt aResult)
	{
	LOG_FUNC

	if (aMessage.IsNull() == EFalse)
		{
	    aMessage.Complete(aResult);
		}
	}


/**
 Handle an error from CPbapSession::ServiceL()
 bad descriptor error implies a badly programmed client, so panic it
 otherwise use the default handling (report the error to the client)
 */
void CPbapSession::ServiceError(const RMessage2& aMessage, TInt aError)
	{
	LOG_FUNC
	if (aError==KErrBadDescriptor)
		{
		// panic the client
		aMessage.Panic(KPbapServerPanic, EPbapServerPanicBadDescriptor);
		}
	CSession2::ServiceError(aMessage, aError);
	}