convergedconnectionhandler/cchserver/src/cchsubsession.cpp
changeset 0 a4daefaec16c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedconnectionhandler/cchserver/src/cchsubsession.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -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 <cchclientserver.h>
+
+#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<TServiceStatus> 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<TCCHSubserviceType>(
+                                                    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