wvuing/IMPSConnectionUI/ServiceSrc/CCnUiConnModeHandler.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wvuing/IMPSConnectionUI/ServiceSrc/CCnUiConnModeHandler.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,382 @@
+/*
+* Copyright (c) 2004 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:  Connection mode handler implementation.
+*
+*/
+
+// INCLUDE FILES
+#include <E32Std.h>
+#include "CCnUiConnModeHandler.h"
+#include "CnUiPanics.h"
+
+
+
+// ================= GLOBAL FUNCTIONS =======================
+// -----------------------------------------------------------------------------
+// CreateConnModeHandlerL()
+// -----------------------------------------------------------------------------
+//
+GLREF_C MCnUiConnModeHandler* CreateConnModeHandlerL()
+    {
+    return CCnUiConnModeHandler::NewL();
+    }
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+// Two-phased constructor.
+CCnUiConnModeHandler* CCnUiConnModeHandler::NewL()
+    {
+    CCnUiConnModeHandler* self = new ( ELeave ) CCnUiConnModeHandler;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// Destructor
+CCnUiConnModeHandler::~CCnUiConnModeHandler()
+    {
+    //Cancel any outstanding request
+    CancelRegisteringAsSSClient();
+    CancelConnectionModeNotify();
+    }
+
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CCnUiConnModeHandler::CCnUiConnModeHandler()
+    {
+    }
+
+
+// Symbian OS default constructor can leave.
+void CCnUiConnModeHandler::ConstructL()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::SendUserSelectionL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiConnModeHandler::SendUserSelectionL( TIMPSUserConnectionSelection aUserSelection,
+                                               TIMPSConnectionClient aClient )
+    {
+    TIMPSConnectionModeEvent event = EIMPSCMEUnknown;
+    switch ( aUserSelection )
+        {
+        case EUserLevelLogin:
+            {
+            event = EIMPSCMEUserLevelLogin;
+            break;
+            }
+
+        case EUserLevelLogout:
+            {
+            event = EIMPSCMEUserLevelLogout;
+            break;
+            }
+
+        case EUserLevelAAConnectionStart:
+            {
+            event = EIMPSCMEUserLevelAAConnectionStart;
+            break;
+            }
+
+        default:
+            {
+            User::Leave( KErrArgument );
+            break;
+            }
+        }
+
+    CCnUiGroupChannel* loginLogoutChannel =
+        CCnUiGroupChannel::NewLC( aClient,
+                                  ECnUiLoginLogoutEventChannel );
+    loginLogoutChannel->WriteL( event );
+    CleanupStack::PopAndDestroy( loginLogoutChannel ); //loginLogoutChannel
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::RegisterAsSignificantSchedulingClientL()
+// -----------------------------------------------------------------------------
+//
+TInt CCnUiConnModeHandler::RegisterAsSignificantSchedulingClientL( TIMPSConnectionClient aClient )
+    {
+    if ( iSSReqistration )
+        {
+        return KErrInUse;
+        }
+
+    iSSReqistration = CCnUiGroupChannel::NewL( aClient,
+                                               ECnUiSSClientReqistrationChannel );
+    iSSReqistration->SignalL();
+    return KErrNone;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::CancelRegisteringAsSSClient()
+// -----------------------------------------------------------------------------
+//
+void CCnUiConnModeHandler::CancelRegisteringAsSSClient()
+    {
+    if ( iSSReqistration )
+        {
+        iSSReqistration->CancelSignal();
+        delete iSSReqistration;
+        iSSReqistration = NULL;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::ConnectionModeL()
+// -----------------------------------------------------------------------------
+//
+TIMPSConnectionModeEvent CCnUiConnModeHandler::ConnectionModeL(
+    TIMPSConnectionClient aClient,
+    TIMPSConnectionModeEvent aModeEventCateqory )
+    {
+    TInt cateqorizedEvent = EIMPSCMEUnknown;
+
+    if ( aModeEventCateqory == EIMPSCMEUserLevelSelectionEventGroup )
+        {
+        //client wants the login logout event value
+        //retrieve value from channel & verify its range
+
+        CCnUiGroupChannel* loginLogoutChannel =
+            CCnUiGroupChannel::NewLC( aClient,
+                                      ECnUiLoginLogoutEventChannel );
+        TInt lastEventValue = KErrNotFound;
+        loginLogoutChannel->Read( lastEventValue );
+        CleanupStack::PopAndDestroy( loginLogoutChannel ); //loginLogoutChannel
+
+        if ( LoginLogoutModeCategoryEvent( lastEventValue ) )
+            {
+            cateqorizedEvent = lastEventValue;
+            }
+        }
+
+
+    else if ( aModeEventCateqory == EIMPSCMESSClientEventGroup )
+        {
+        //client wants the SS Client Start/Stop event
+        //retrieve the client registration count channel
+
+        CCnUiGroupChannel* reqistrationChannel =
+            CCnUiGroupChannel::NewLC( aClient,
+                                      ECnUiSSClientReqistrationChannel );
+        TInt clientReqistrationCount = KErrNotFound;
+        reqistrationChannel->Read( clientReqistrationCount );
+        CleanupStack::PopAndDestroy( reqistrationChannel ); //reqistrationChannel
+
+        if ( clientReqistrationCount == 0 ) //0 client currently registered ==> last stopped
+            {
+            cateqorizedEvent = EIMPSCMELastSSClientStop;
+            }
+
+        else if ( clientReqistrationCount > 0 ) //more than 0 currently registered clients
+            {
+            cateqorizedEvent = EIMPSCMEFirstSSClientStart;
+            }
+        }
+
+    return static_cast<TIMPSConnectionModeEvent> ( cateqorizedEvent );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::NotifyConnectionModeChangesL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiConnModeHandler::NotifyConnectionModeChangesL( MCnUiConnModeObserver* aObserver,
+                                                         TIMPSConnectionClient aClientToNotify )
+    {
+    __ASSERT_ALWAYS( !iConnModeObserver, User::Leave( KErrInUse ) );
+    __ASSERT_ALWAYS( aObserver, User::Leave( KErrArgument ) );
+
+    TRAPD( err, DoStartNotifyL( aClientToNotify ) );
+    if ( err != KErrNone )
+        {
+        CancelConnectionModeNotify();
+        User::Leave( err );
+        }
+
+    //store observer information
+    iConnModeObserver = aObserver;
+    iObserverClient = aClientToNotify;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::CancelConnectionModeNotify()
+// -----------------------------------------------------------------------------
+//
+void CCnUiConnModeHandler::CancelConnectionModeNotify()
+    {
+    delete iLoginLogoutEventChannelListener;
+    delete iSSReqistrationChannelListener;
+
+    iLoginLogoutEventChannelListener = NULL;
+    iSSReqistrationChannelListener = NULL;
+
+    iConnModeObserver = NULL;
+    iSSClientCountPrev = KErrNotFound;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::HandleNotifyL()
+// from MCnUiGroupChannelListener
+// -----------------------------------------------------------------------------
+//
+void CCnUiConnModeHandler::HandleChannelMsg( TInt aGroupId,
+                                             TGCChannelID aChannelId,
+                                             TInt aChannelMsg )
+    {
+    if ( iObserverClient != aGroupId )
+        {
+        return;
+        }
+
+    if ( aChannelId == ECnUiLoginLogoutEventChannel )
+        {
+        //login/logout related event
+        TIMPSConnectionModeEvent event = static_cast<TIMPSConnectionModeEvent>( aChannelMsg );
+        if ( LoginLogoutModeCategoryEvent( event ) )
+            {
+            iConnModeObserver->HandleConnModeChange( iObserverClient, event ) ;
+            }
+        }
+
+    else if ( aChannelId == ECnUiSSClientReqistrationChannel )
+        {
+        //SSClient start/stop event - actually a signal count
+
+        //If client count increased from zero to 1 ==> first client started
+        if ( ( iSSClientCountPrev == 0 ) && ( aChannelMsg == 1 ) )
+            {
+            iConnModeObserver->HandleConnModeChange( iObserverClient, EIMPSCMEFirstSSClientStart );
+            iSSClientCountPrev = aChannelMsg;
+            }
+
+        //If client count decreased to zero ==> last client stopped
+        else if ( ( iSSClientCountPrev > 0 ) && ( aChannelMsg == 0 ) )
+            {
+            iConnModeObserver->HandleConnModeChange( iObserverClient, EIMPSCMELastSSClientStop );
+            iSSClientCountPrev = aChannelMsg;
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::DoStartNotifyL()
+// -----------------------------------------------------------------------------
+//
+void CCnUiConnModeHandler::DoStartNotifyL( TIMPSConnectionClient aClientToNotify )
+    {
+    //start the channel notifier for login/logout related events
+    iLoginLogoutEventChannelListener = CCnUiGroupChannel::NewL( aClientToNotify,
+                                                                ECnUiLoginLogoutEventChannel );
+    iLoginLogoutEventChannelListener->ListenL( this );
+
+    //start the channel notifier for client start/stops
+    iSSReqistrationChannelListener = CCnUiGroupChannel::NewL( aClientToNotify,
+                                                              ECnUiSSClientReqistrationChannel );
+    iSSReqistrationChannelListener->ListenL( this );
+
+
+    TInt clientReqistrationCount = KErrNotFound;
+    iSSReqistrationChannelListener->Read( clientReqistrationCount );
+
+    //if there is a positive registration count, use it.
+    //Else default pre count to 0
+    if ( clientReqistrationCount >= 0 )
+        {
+        iSSClientCountPrev = clientReqistrationCount;
+        }
+    else
+        {
+        iSSClientCountPrev = 0;
+        }
+    }
+
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::LoginLogoutModeCategoryEvent()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiConnModeHandler::LoginLogoutModeCategoryEvent( TInt aEvent )
+    {
+    switch ( aEvent )
+        {
+            //FLOW TROUGH
+        case EIMPSCMEUserLevelLogout:
+        case EIMPSCMEUserLevelLogin:
+        case EIMPSCMEUserLevelAAConnectionStart:
+            {
+            //known events
+            return ETrue;
+            // no break needed because of return
+            }
+
+        default:
+            {
+            //unknown event
+            break;
+            }
+        }
+
+    return EFalse;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CCnUiConnModeHandler::SSClientStartStopEvent()
+// -----------------------------------------------------------------------------
+//
+TBool CCnUiConnModeHandler::SSClientStartStopCategoryEvent( TInt aEvent )
+    {
+    switch ( aEvent )
+        {
+            //FLOW TROUGH
+        case EIMPSCMEFirstSSClientStart:
+        case EIMPSCMELastSSClientStop:
+            {
+            //known events
+            return ETrue;
+            // no break needed because of return
+            }
+
+        default:
+            {
+            //unknown event for this category
+            break;
+            }
+        }
+
+    return EFalse;
+    }
+
+
+
+//  End of File
+