diff -r 6ca72c0fe49a -r a941bc465d9f PECengine/PresenceServer2/ServerSrc/CPEngSession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceServer2/ServerSrc/CPEngSession.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,244 @@ +/* +* Copyright (c) 2002 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: Presence Server session handler implementation +* All clients request are handler here, +* or forwarded to the sub-session +* +*/ + + + +// Include Files +#include +#include "CPEngSession.h" +#include "MPEngServer.h" +#include "CPEngSubSession.h" +#include "RPEngMessage.h" +#include "TPEngServerCommon.h" + +// Debug prints +#include "PresenceDebugPrint.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngSession::CPEngSession +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPEngSession::CPEngSession( + MPEngServer& aServer ) + : iMainServer( aServer ) + { + iMainServer.SessionCreated(); + } + +// ----------------------------------------------------------------------------- +// CPEngSession::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngSession::ConstructL() + { + iSubSessions = CObjectIx::NewL(); + } + +// Static constructor +CPEngSession* CPEngSession::NewL( MPEngServer& aServer ) + { + CPEngSession* self = new( ELeave ) CPEngSession( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// Destructor (virtual by CBase) +CPEngSession::~CPEngSession() + { + delete iSubSessions; + // If main session will have some Async operations, + // it needs to be canceled here + iMainServer.SessionDied(); + } + +// ============================================================================= +// =============== Functions from CSession2 base class ========================= +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngSession::ServiceL() +// ----------------------------------------------------------------------------- +// +void CPEngSession::ServiceL( + const RMessage2 &aMessage ) + { + PENG_DP( D_PENG_LIT( "CPEngSession::ServiceL:%d" ), aMessage.Function() ); + + if ( DispatchMessageL( RPEngMessage( aMessage ) ) ) + { + aMessage.Complete( KErrNone ); + } + PENG_DP( D_PENG_LIT( "CPEngSession::ServiceL:%d -End" ), aMessage.Function() ); + } + +// ----------------------------------------------------------------------------- +// CPEngSession::ServiceError() +// ----------------------------------------------------------------------------- +// +void CPEngSession::ServiceError( + const RMessage2& aMessage, + TInt aError ) + { + PENG_DP( D_PENG_LIT( "CPEngSession::ServiceError: %d" ), aError ); + aMessage.Complete( aError ); + } + +// ============================================================================= +// =============== Private functions of the Session class ====================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngSession::DispatchMessageL() +// Dispatch message +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CPEngSession::DispatchMessageL( + const RPEngMessage& aMessage ) + { + TInt request( aMessage.Function() ); + TBool completeRequest( ETrue ); + + switch ( request ) + { + case EMainSessCreateHolderSubSession: + case EMainSessCreateTransactionSubSession: + { + CreateNewSubSessionL( aMessage ); + break; + } + + case EMainSessCloseSubSession: + { + RemoveSubSessionL( aMessage.Int3() ); + break; + } + default: + { + // try to handle message in sub-session + CPEngSubSession& subSession = FindSubSessionL( aMessage.Int3() ); + completeRequest = subSession.DispatchMessageL( aMessage, request ); + break; + } + } + return completeRequest && aMessage.MessageValid(); + } + +// ----------------------------------------------------------------------------- +// CPEngSession::CreateNewSubSessionL() +// Create new sub-session +// Back to the client is written handle of the created Sub session +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngSession::CreateNewSubSessionL( + const RPEngMessage& aMessage ) + { + PENG_DP( D_PENG_LIT( "CPEngSession::CreateNewSubSessionL" ) ); + CPEngSubSession* subSession = + CPEngSubSession::NewLC( + iMainServer, + aMessage, + reinterpret_cast( this ) ); + + iMainServer.AddSubSessionL( *subSession ); + CleanupStack::Pop( ); // newSubsSession + + TInt handle( 0 ); + TRAPD( err, handle = iSubSessions->AddL( subSession ) ); + if ( err != KErrNone ) + { + iMainServer.RemoveSubSessionL( *subSession ); + User::Leave( err ); + } + + subSession->SetSubSesionHandle( handle ); + + // write back handle of the sub-session + TPckg handlePckg( handle ); + err = aMessage.WriteOneDescriptor( KMessageSlot3 , handlePckg ); + if ( err != KErrNone ) + { + iSubSessions->Remove( handle ); + PanicClient( aMessage, EPECBadDescriptor ); + return; + } + } + + +// ----------------------------------------------------------------------------- +// CPEngSession::RemoveSubSession() +// Remove Sub-Session +// Function leaves if there is no such a subssession +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngSession::RemoveSubSessionL( + TUint aHandle ) + { + // this will leave if there is such a sub-session + FindSubSessionL( aHandle ); + iSubSessions->Remove( aHandle ); + } + +// ----------------------------------------------------------------------------- +// CPEngSession::FindSubSession() +// Find Sub-session +// Function leaves if such a subsession does not exists +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CPEngSubSession& CPEngSession::FindSubSessionL( + TUint aHandle ) const + { + // if there is no sub-session, it leaves with KErrBadHandle + return static_cast ( *( iSubSessions->AtL( aHandle ) ) ); + } + +// ----------------------------------------------------------------------------- +// CPEngSession::PanicClient() +// Panic client +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngSession::PanicClient( + const RPEngMessage& aMessage, + const TInt aPanic ) const + { + aMessage.Panic( KSessionName, aPanic ); + } + +// End of File + + + + + + + + +