diff -r f742655b05bf -r d38647835c2e convergedconnectionhandler/cchserver/src/cchsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/convergedconnectionhandler/cchserver/src/cchsession.cpp Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,209 @@ +/* +* Copyright (c) 2006-2007 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: CCCHSession implementation +* +*/ + + +// INCLUDE FILES +#include "cchlogger.h" +#include "cchsession.h" +#include "cchserverbase.h" +#include "cchsubsession.h" +#include "cchclientserverinternal.h" + +// EXTERNAL DATA STRUCTURES +// None + +// EXTERNAL FUNCTION PROTOTYPES +// None + +// CONSTANTS +// None + +// MACROS +// None + +// LOCAL CONSTANTS AND MACROS +// None + +// MODULE DATA STRUCTURES +// None + +// LOCAL FUNCTION PROTOTYPES +// None + +// FORWARD DECLARATIONS +// None + +// ============================= LOCAL FUNCTIONS ============================= + +// ============================ MEMBER FUNCTIONS ============================= + +// --------------------------------------------------------------------------- +// CCCHSession::CCCHSession +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CCCHSession::CCCHSession( CCCHServerBase& aServer ) : + CSession2(), + iCCHServer( aServer ) + { + TRAP_IGNORE( iCCHServer.NotifySessionCreatedL() ); + } + +// --------------------------------------------------------------------------- +// CCCHSession::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CCCHSession::ConstructL() + { + iSubsessions = iCCHServer.ObjectContainerIx().CreateL(); + iObjectIx = CObjectIx::NewL(); + } + +// --------------------------------------------------------------------------- +// CCCHSession::NewL +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CCCHSession* CCCHSession::NewL( CCCHServerBase& aServer ) + { + CCCHSession* self = CCCHSession::NewLC( aServer ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CCCHSession::NewLC +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CCCHSession* CCCHSession::NewLC( CCCHServerBase& aServer ) + { + CCCHSession* self = new (ELeave) CCCHSession( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor +CCCHSession::~CCCHSession() + { + delete iObjectIx; + iObjectIx = NULL; + + iCCHServer.ObjectContainerIx().Remove( iSubsessions ); + iCCHServer.NotifySessionClosed(); + } + +// --------------------------------------------------------------------------- +// CCCHSession::ServiceL +// Handles request received from client. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CCCHSession::ServiceL( const RMessage2& aMessage ) + { + CCHLOGSTRING( "CCCHSession::ServiceL: IN" ); + TInt command = aMessage.Function(); + switch ( command ) + { + case ECCHOpenSubSession: + { + CCCHSubsession* subsession = CCCHSubsession::NewLC( iCCHServer ); + iSubsessions->AddL( subsession ); + const TInt handle( iObjectIx->AddL( subsession ) ); + CleanupStack::Pop( subsession ); + TPckg handlePckg( handle ); + TInt err = aMessage.Write( 3, handlePckg ); + + if ( KErrNone != err ) + { + // Panic client + iObjectIx->Remove( handle ); + iCCHServer.PanicClient( aMessage, ECCHErrSubSessionOpen ); + } + else + { + aMessage.Complete( KErrNone ); + } + } + break; + case ECCHCloseSubSession: + { + const TInt handle( aMessage.Int3() ); + if ( iObjectIx->At( handle ) ) + { + iObjectIx->Remove( handle ); + aMessage.Complete( KErrNone ); + } + else + { + // Panic client. Handle was not valid + iCCHServer.PanicClient( aMessage, ECCHErrSubSessionClose ); + } + } + break; + /** + * CCH subsession functions + */ + case ECCHSubscribeToEvents: + case ECCHSubscribeToEventsCancel: + case ECCHGetServices: + case ECCHGetServicesCancel: + case ECCHGetServiceState: + case ECCHEnableService: + case ECCHEnableServiceCancel: + case ECCHDisableService: + case ECCHDisableServiceCancel: + case ECCHGetServiceInfo: + case ECCHGetPreferredService: + case ECCHSetConnectionInfo: + case ECCHSetConnectionInfoCancel: + case ECCHGetConnectionInfo: + case ECCHGetConnectionInfoCancel: + case ECCHReserveService: + case ECCHFreeService: + case ECCHIsReserved: + case ECCHServiceCount: + case ECCHServerRegister: + case ECCHServerRegisterCancel: + { + CCCHSubsession* subsession = static_cast( + iObjectIx->At( aMessage.Int3() ) ); + if ( subsession ) + { + subsession->ServiceL( aMessage ); + } + else + { + // Panic client. + iCCHServer.PanicClient( aMessage, ECCHBadDescriptor ); + } + } + break; + default: + { + iCCHServer.PanicClient( aMessage, ECCHBadRequest ); + } + + } + CCHLOGSTRING( "CCCHSession::ServiceL: OUT" ); + } + +// ========================== OTHER EXPORTED FUNCTIONS ======================= + +// End of File