diff -r f742655b05bf -r d38647835c2e convergedconnectionhandler/cchserver/src/cchsubsession.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/convergedconnectionhandler/cchserver/src/cchsubsession.cpp Wed Sep 01 12:29:57 2010 +0100 @@ -0,0 +1,398 @@ +/* +* 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: CCCHSubsession implementation +* +*/ + + +// INCLUDE FILES +#include + +#include "cchlogger.h" +#include "cchsubsession.h" +#include "cchserverbase.h" +#include "cchrequeststorage.h" +#include "cchpluginhandler.h" +#include "cchservicehandler.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 ============================= + +// --------------------------------------------------------------------------- +// CCCHSubsession::CCCHSubsession +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CCCHSubsession::CCCHSubsession( CCCHServerBase& aServer ) : + iServer( aServer ), + iMessage( NULL ), + iQueueEvents( EFalse ) + { + } + +// --------------------------------------------------------------------------- +// CCCHSubsession::NewL +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CCCHSubsession* CCCHSubsession::NewL( CCCHServerBase& aServer ) + { + CCCHSubsession* self = CCCHSubsession::NewLC( aServer ); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// CCCHSubsession::NewLC +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CCCHSubsession* CCCHSubsession::NewLC( CCCHServerBase& aServer ) + { + CCCHSubsession* self = new (ELeave)CCCHSubsession( aServer ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor +CCCHSubsession::~CCCHSubsession() + { + iServer.RequestStorage().RemoveRequestsBySession( this ); + iServer.RequestStorage().RemoveSession( this ); + iEventQueue.Close(); + + delete iRegisterMessage; + delete iMessage; + } + + +// --------------------------------------------------------------------------- +// CCCHSubsession::ConstructL +// --------------------------------------------------------------------------- +// +void CCCHSubsession::ConstructL( ) + { + CCHLOGSTRING( "CCCHSubsession::ConstructL: IN" ); + + iServer.RequestStorage().AddSession( this ); + + CCHLOGSTRING( "CCCHSubsession::ConstructL: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCCHSubsession::ServiceEventOccured +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CCCHSubsession::ServiceEventOccured( + TServiceStatus aNewStatus ) + { + CCHLOGSTRING( "CCCHSubsession::ServiceEventOccured: IN" ); + //if are we queuing + if( iQueueEvents ) + { + //check if we can accept this event + if ( 0 == iSubscribedService.iServiceId || // all services + iSubscribedService.iServiceId == aNewStatus.ServiceId() ) // specified service + { + if ( iSubscribedService.iType == ECCHUnknown || + iSubscribedService.iType == aNewStatus.Type() ) // subservice specified + { + iEventQueue.Append( aNewStatus ); + CompleteMessage( ); + } + } + } + + CCHLOGSTRING( "CCCHSubsession::ServiceEventOccured: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCCHSubsession::CompleteMessage +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CCCHSubsession::CompleteMessage( ) + { + CCHLOGSTRING( "CCCHSubsession::CompleteMessage: IN" ); + //if there is pending SubscribeToEvents and we have something in queue + if( iMessage && 0 < iEventQueue.Count() ) + { + TInt error( KErrNone ); + TPckgBuf serviceStatus; + + // while we append to queue, we consume from the start (fifo) + serviceStatus() = iEventQueue[ 0 ]; + CCHLOGSTRING2( "CCCHSubsession::CompleteMessage: type : %d", serviceStatus().Type() ); + CCHLOGSTRING2( "CCCHSubsession::CompleteMessage: state : %d", serviceStatus().iState ); + // Write status to IPC message + TRAP( error, iMessage->WriteL( 2, serviceStatus ) ); + + //complete & delete message + iMessage->Complete( error ); + delete iMessage; + iMessage = NULL; + + // Remove consumed event from queue + iEventQueue.Remove( 0 ); + } + CCHLOGSTRING( "CCCHSubsession::CompleteMessage: OUT" ); + } + +// --------------------------------------------------------------------------- +// CCCHSubsession::ServiceL +// Handles request received from client. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +void CCCHSubsession::ServiceL( const RMessage2& aMessage ) + { + CCHLOGSTRING( "CCCHSubsession::ServiceL: IN" ); + TInt command = aMessage.Function(); + switch ( command ) + { + case ECCHServerRegister: + { + if( !iRegisterMessage ) + { + iRegisterMessage = new (ELeave) RMessage2( aMessage ); + } + + break; + } + + case ECCHServerRegisterCancel: + { + if( iRegisterMessage ) + { + iRegisterMessage->Complete( KErrCancel ); + delete iRegisterMessage; + iRegisterMessage = NULL; + } + aMessage.Complete( KErrNone ); + break; + } + case ECCHSubscribeToEvents: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHSubscribeToEvents" ); + iMessage = new (ELeave) RMessage2( aMessage ); + //set the service (or set of services) we are interested in + iSubscribedService.iServiceId = iMessage->Int0(); + iSubscribedService.iType = static_cast( + iMessage->Int1() ); + //start queuing + iQueueEvents = ETrue; + //try to complete message + CompleteMessage( ); + } + break; + case ECCHSubscribeToEventsCancel: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHSubscribeToEventsCancel" ); + //if ECCHSubscribeToEvents request is pending, complete & delete it + if( iMessage ) + { + iMessage->Complete( KErrCancel ); + delete iMessage; + iMessage = NULL; + } + // Complete cancel request + aMessage.Complete( KErrNone ); + //stop & reset the queue + iQueueEvents = EFalse; + iEventQueue.Reset(); + } + break; + case ECCHGetServices: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetServices" ); + iServer.RequestStorage().AddRequestL( ECCHGetServices, + aMessage, this ); + } + break; + case ECCHGetServicesCancel: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetServicesCancel" ); + iServer.RequestStorage().CompleteRequest( ECCHGetServices, + this, KErrCancel ); + aMessage.Complete( KErrNone ); + } + break; + case ECCHGetServiceState: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetServiceState" ); + TInt err( KErrNone ); + err = iServer.ServiceHandler().GetServiceState( aMessage ); + aMessage.Complete( err ); + } + break; + case ECCHEnableService: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHEnableService" ); + iServer.RequestStorage().AddRequestL( ECCHEnableService, + aMessage, this ); + } + break; + case ECCHEnableServiceCancel: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHEnableServiceCancel" ); + iServer.RequestStorage().CompleteRequest( ECCHEnableService, + this, KErrCancel ); + aMessage.Complete( KErrNone ); + } + break; + case ECCHDisableService: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHDisableService" ); + iServer.RequestStorage().AddRequestL( ECCHDisableService, + aMessage, this ); + } + break; + case ECCHDisableServiceCancel: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHDisableServiceCancel" ); + iServer.RequestStorage().CompleteRequest( ECCHDisableService, + this, KErrCancel ); + aMessage.Complete( KErrNone ); + } + break; + case ECCHGetServiceInfo: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetServiceInfo" ); + TInt err( KErrNone ); + err = iServer.ServiceHandler().GetServiceInfo( aMessage ); + aMessage.Complete( err ); + } + break; + case ECCHGetPreferredService: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetPreferredService" ); + aMessage.Complete( KErrNotSupported ); + } + break; + case ECCHSetConnectionInfo: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHSetConnectionInfo" ); + iServer.RequestStorage().AddRequestL( ECCHSetConnectionInfo, + aMessage, this ); + } + break; + case ECCHSetConnectionInfoCancel: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHSetConnectionInfoCancel" ); + iServer.RequestStorage().CompleteRequest( ECCHSetConnectionInfo, + this, KErrCancel ); + aMessage.Complete( KErrNone ); + } + break; + case ECCHGetConnectionInfo: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetConnectionInfo" ); + iServer.RequestStorage().AddRequestL( ECCHGetConnectionInfo, + aMessage, this ); + } + break; + case ECCHGetConnectionInfoCancel: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHGetConnectionInfoCancel" ); + iServer.RequestStorage().CompleteRequest( ECCHGetConnectionInfo, + this, KErrCancel ); + aMessage.Complete( KErrNone ); + } + break; + case ECCHServiceCount: + { + iServer.ServiceHandler().ServiceCountL( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + case ECCHReserveService: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHReserveService" ); + TInt err( KErrNone ); + err = iServer.ServiceHandler().ReserveService( aMessage ); + aMessage.Complete( err ); + } + break; + case ECCHFreeService: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHFreeService" ); + TInt err( KErrNone ); + err = iServer.ServiceHandler().FreeService( aMessage ); + aMessage.Complete( err ); + } + break; + case ECCHIsReserved: + { + CCHLOGSTRING + ( "CCCHSubsession::ServiceL :ECCHIsReserved" ); + iServer.ServiceHandler().IsReserved( aMessage ); + aMessage.Complete( KErrNone ); + } + break; + default: + { + CCHLOGSTRING( "CCCHSubsession::ServiceL :ECCHBadRequest" ); + iServer.PanicClient( aMessage, ECCHBadRequest ); + } + } + CCHLOGSTRING( "CCCHSubsession::ServiceL: OUT" ); + } + +// ========================== OTHER EXPORTED FUNCTIONS ======================= + +// End of File