commsconfig/cscapplicationui/src/cscappui.cpp
branchRCL_3
changeset 22 d38647835c2e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/cscapplicationui/src/cscappui.cpp	Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,546 @@
+/*
+* Copyright (c) 2007-2010 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:  CSC Applicationīs AppUi
+*
+*/
+
+
+#include <apgcli.h>
+#include <AknDoc.h>
+#include <eikclb.h>
+#include <aknview.h>
+#include <eikappui.h>
+#include <cchclient.h>
+#include <cmmanagerext.h>
+#include <AknIconUtils.h>
+#include <AknsConstants.h>
+#include <cscsettingsui.h>
+#include <xSPViewServices.h>
+#include <AiwServiceHandler.h>
+#include <mspnotifychangeobserver.h>
+#include <gsfwviewuids.h>
+#include <apgwgnam.h>
+
+#include "cscappui.h"
+#include "csclogger.h"
+#include "cscdocument.h"
+#include "cscconstants.h"
+#include "cscserviceview.h"
+#include "cscengcchhandler.h"
+#include "cscengstartuphandler.h"
+#include "cscengservicehandler.h"
+#include "cscengbrandinghandler.h"
+#include "cscengconnectionhandler.h"
+#include "cscengservicepluginhandler.h"
+#include "cscengdestinationshandler.h"
+#include "cscenguiextensionpluginhandler.h"
+
+const TInt KMaxParamLength = 255;
+const TInt KGSChildAppWindowGroupNameLength = 100;
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCAppUi::CCSCAppUi()                         
+    {
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::ConstructL()
+    {
+    CSCDEBUG( "CCSCAppUi::ConstructL - begin" );
+    
+    BaseConstructL( 
+        EAknEnableSkin | EAknEnableMSK | EAknSingleClickCompatible );
+    
+    iStartupHandler = CCSCEngStartupHandler::NewL();
+    iServiceHandler = CCSCEngServiceHandler::NewL( this );
+    iBrandingHandler = CCSCEngBrandingHandler::NewL();
+    iCCHHandler = CCSCEngCCHHandler::NewL( *this );
+    iConnectionHandler = CCSCEngConnectionHandler::NewL( *this );
+    
+    CCSCEngServicePluginHandler* servicePluginHandler = 
+        CCSCEngServicePluginHandler::NewL( 
+            *iEikonEnv, *this, *iServiceHandler );
+    
+    CleanupStack::PushL( servicePluginHandler );
+    
+    CCSCEngUiExtensionPluginHandler* uiExtensionPluginHandler = 
+        CCSCEngUiExtensionPluginHandler::NewL( 
+            *iEikonEnv, *this, *iStartupHandler );
+
+    CleanupStack::Pop( servicePluginHandler );
+    
+    // Responsibility or Plugin Handlers are transferred to document,
+    // because UI framework might make calls to ECom plugin after the
+    // application UI is deleted. Case exists when Exit() is 
+    // called from plugin.
+    CCSCDocument* doc = static_cast< CCSCDocument* >( Document() );
+    doc->SetOwnershipOfPluginHandlers( 
+        servicePluginHandler, uiExtensionPluginHandler );
+    
+    TRAP_IGNORE(   
+        servicePluginHandler->InitializePluginsL();
+        uiExtensionPluginHandler->InitializePluginsL();
+        );
+        
+    iServiceView = CCSCServiceView::NewL( 
+        *servicePluginHandler, 
+        *uiExtensionPluginHandler,
+        *iStartupHandler,
+        *iServiceHandler,
+        *iBrandingHandler,
+        *iCCHHandler );
+    
+    AddViewL( iServiceView );
+     
+    CSCDEBUG( "CCSCAppUi::ConstructL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCAppUi::~CCSCAppUi()
+    {
+    CSCDEBUG( "CCSCAppUi::~CCSCAppUi - begin" );
+        
+    delete iStartupHandler;
+    delete iServiceHandler;
+    delete iBrandingHandler;
+    delete iCCHHandler;
+    delete iConnectionHandler;
+                  
+    CSCDEBUG( "CCSCAppUi::~CCSCAppUi - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CEikAppUi
+// For giving startup parameters to CSC application
+// ---------------------------------------------------------------------------
+//
+TBool CCSCAppUi::ProcessCommandParametersL(
+    TApaCommand /*aCommand*/,
+    TFileName& aDocumentName,
+    const TDesC8& /*aTail*/)
+    {
+    CSCDEBUG( "CCSCAppUi::ProcessCommandParametersL - begin" );
+    
+    if ( aDocumentName.Length() )
+        {
+        iStartupHandler->SetStartupParametersL( aDocumentName );
+        if ( CCSCEngStartupHandler::EOpenSettingsUi == 
+            iStartupHandler->GetParamAction() )
+            {
+            iServiceView->InitializeWithStartupParametersL();
+            }
+        }
+        
+    CSCDEBUG( "CCSCAppUi::ProcessCommandParametersL - end" );
+    
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// From class CEikAppUi
+// For giving startup parameters to CSC application
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::ProcessMessageL( TUid /* aUid */, const TDesC8 &aParams )
+	{
+	CSCDEBUG( "CCSCAppUi::ProcessMessageL - begin" );
+	    
+	if ( aParams.Length() && ( aParams.Length() <= KMaxParamLength ) )
+	    {
+        TBuf<KMaxParamLength> params;
+	    params.Copy( aParams );  
+	    iStartupHandler->SetStartupParametersL( params );
+	        
+	    iServiceView->InitializeWithStartupParametersL();
+	    iServiceView->ExecuteStartupActionsL( EFalse, EFalse );
+	    }
+	        
+	CSCDEBUG( "CCSCAppUi::ProcessMessageL - end" );
+	}
+
+
+// ---------------------------------------------------------------------------
+// From class CAknViewAppUi
+// For command handling.
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::HandleCommandL( TInt aCommand ) 
+    {
+    CSCDEBUG( "CCSCAppUi::HandleCommandL - begin" );
+    
+    switch ( aCommand )
+        {
+        case EAknSoftkeyBack:
+            {
+            Exit();
+            break;
+            }
+        case EEikCmdExit:
+        case EAknSoftkeyExit:
+        case EAknCmdExit:
+            {
+            ExitGSIfParentL();
+            Exit();
+            break;
+            }
+        default:
+            break;
+        }
+    
+    CSCDEBUG( "CCSCAppUi::HandleCommandL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class CAknViewAppUi
+// Handling changing of the skin and layout.
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::HandleResourceChangeL( TInt aType )
+    {
+    CSCDEBUG( "CCSCAppUi::HandleResourceChangeL" );
+
+    CAknViewAppUi::HandleResourceChangeL( aType );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCProvisioningObserver
+// Notifies service plug-in event
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::NotifyServicePluginResponse( 
+    const CCSCEngServicePluginHandler::TServicePluginResponse& aResponse, 
+    const TInt aIndex, 
+    const TUid& aPluginUid )
+    {
+    CSCDEBUG( "CCSCAppUi::NotifyServicePluginResponse - begin" );
+    
+    CCSCEngStartupHandler::TAction action = iStartupHandler->GetParamAction();
+    TUid pluginUid = iStartupHandler->GetParamPluginUid();
+  
+    switch ( aResponse )
+        {
+        case CCSCEngServicePluginHandler::EPluginInitialized:
+            {           
+            // Run service configuration procedure, if new plugin is added
+            // after service setup plugins has been initialized and plugin 
+            // is set to be configured in startup parameters.
+            if ( CCSCEngStartupHandler::EAddSetupPluginService == action &&
+                aPluginUid == pluginUid )
+                {       
+                TRAP_IGNORE( 
+                    TBool canceled ( EFalse );
+                    canceled = iServiceView->HandleServiceConfigurationL( 
+                                aPluginUid );
+                                
+                    if ( canceled )
+                        {
+                        iServiceView->ExecuteStartupActionsL();
+                        }
+                    );
+                } 
+            else if ( iStartupHandler->StartedFromHomescreen() )
+                {
+                TRAP_IGNORE( iServiceView->HandleServiceConfigurationL( KNullUid ) );
+                }
+            break;
+            }
+        case CCSCEngServicePluginHandler::EPluginProvisioned:
+            {
+            CSCDEBUG( "CCSCAppUi::NotifyServicePluginResponse - plugin provisioned" );
+                  
+            // shutdown csc (provisioned service plugin should open phonebook tab).
+            RunAppShutter();
+            break;
+            }
+        case CCSCEngServicePluginHandler::EPluginRemoved:
+            {
+            // Service removed. If application is started with statup
+            // parameters, close application and retuns to application
+            // installer. Otherwise dismiss wait note from the screen.
+            if ( CCSCEngStartupHandler::ERemoveSetupPluginService == action &&
+                KNullUid != pluginUid )
+                {
+                iServiceView->HideDialogWaitNote();
+                RunAppShutter();
+                }
+            else
+                {
+                CCSCDocument* doc = 
+                    static_cast< CCSCDocument* >( Document() );
+                    
+                CCSCEngServicePluginHandler& handler = 
+                    doc->ServicePluginHandler();
+
+                TServicePluginInfo pluginInfo = 
+                    handler.ItemFromPluginInfoArray( aIndex );
+                          
+                CAknView* view = View( pluginInfo.iViewId );
+                if( !view )
+                    {
+                    RemoveView( pluginInfo.iViewId );
+                    }
+                else
+                    {
+                    // nothing to do
+                    }
+                       
+                iServiceView->HideDialogWaitNote();
+                }
+            break;
+            }
+        case CCSCEngServicePluginHandler::EPluginError:
+            {
+            TRAP_IGNORE( iServiceView->ServiceConfiguringFailedL( aIndex ) );
+            break;
+            }
+        case CCSCEngServicePluginHandler::EPluginModified:
+        default:
+             break;
+        }
+    
+    CSCDEBUG( "CCSCAppUi::NotifyServicePluginResponse - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCUiExtensionObserver
+// Notifies when configuring of service plug-in is done.
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::NotifyUiExtensionPluginResponse( 
+    const CCSCEngUiExtensionPluginHandler::TUiExtensionPluginResponse& 
+    aResponse, 
+    const TInt /*aIndex*/, 
+    const TUid& /*aPluginUid*/ )
+    {
+    CSCDEBUG( "CCSCAppUi::NotifyUiExtensionPluginResponse - begin" );
+    
+    switch ( aResponse )
+        {
+        case CCSCEngUiExtensionPluginHandler::EPluginExited:
+            {
+            TRAP_IGNORE( iServiceView->HandleUiExtensionExitL() );
+            break;
+            }
+        case CCSCEngUiExtensionPluginHandler::EPluginError:
+            {
+            TRAP_IGNORE( ActivateLocalViewL( KCSCServiceViewId ) );
+            break;
+            }
+        case CCSCEngUiExtensionPluginHandler::EPluginInitialized:
+            // nothing to do
+        default:
+            break;
+        }
+   
+    CSCDEBUG( "CCSCAppUi::NotifyUiExtensionPluginResponse - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCEngServiceObserver
+// Notifies when service(s) have changed.
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::NotifyServiceChange()
+    {
+    CSCDEBUG( "CCSCAppUi::NotifyServiceChange - begin" );
+    
+    TVwsViewId activeViewId;
+    GetActiveViewId( activeViewId );
+    
+    if( iServiceView && KCSCServiceViewId == activeViewId.iViewUid )
+        {
+        TRAP_IGNORE( iServiceView->UpdateServiceViewL() );
+        }
+    
+    CSCDEBUG( "CCSCAppUi::NotifyServiceChange - end" );  
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCEngCCHObserver
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::ServiceStatusChanged(
+    TUint aServiceId, 
+    TCCHSubserviceType /*aType*/, 
+    const TCchServiceStatus& aServiceStatus )
+    {
+    CSCDEBUG2( 
+       "CCSCAppUi::ServiceStatusChanged - STATE=%d", aServiceStatus.State() );
+    
+    if ( ECCHDisabled == aServiceStatus.State() )
+        {        
+        TVwsViewId activeViewId;
+        GetActiveViewId( activeViewId );
+        
+        if( iServiceView && KCSCServiceViewId == activeViewId.iViewUid )
+            {            
+            TRAPD( err, SnapCheckL( aServiceId ) );  
+            
+            if ( KErrInUse == err )
+                {
+                iMonitoredService = aServiceId;
+                }
+            else
+                {
+                TRAP_IGNORE( iServiceView->DeleteServiceL( aServiceId ) );
+                }
+            }
+        }
+        
+    CSCDEBUG( "CCSCAppUi::ServiceStatusChanged - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCEngConnectionObserver
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::NotifyConnectionEvent( 
+    CCSCEngConnectionHandler::TConnectionEvent aConnectionEvent )
+    {
+    CSCDEBUG( "CCSCAppUi::NotifyConnectionEvent - begin" );
+        
+    TVwsViewId activeViewId;
+    GetActiveViewId( activeViewId );
+    
+    if( ( iServiceView && KCSCServiceViewId == activeViewId.iViewUid ) &&
+        ( CCSCEngConnectionHandler::EEventConnectionDown == aConnectionEvent || 
+          CCSCEngConnectionHandler::EEventTimedOut == aConnectionEvent ) )
+        {        
+        iConnectionHandler->StopListeningConnectionEvents();
+        TRAP_IGNORE( iServiceView->DeleteServiceL( iMonitoredService ) );
+        }
+    
+    CSCDEBUG( "CCSCAppUi::NotifyConnectionEvent - end" );
+    }
+
+// ---------------------------------------------------------------------------
+// For checking if SNAP is still in use.
+// ---------------------------------------------------------------------------
+//
+void CCSCAppUi::SnapCheckL( TUint aServiceId ) const
+    {
+    CSCDEBUG( "CCSCAppUi::SnapCheckL - begin" );  
+    
+    CCSCEngDestinationsHandler* destHandler =
+        CCSCEngDestinationsHandler::NewL();
+    CleanupStack::PushL( destHandler );
+    
+    TInt snapId( 0 );
+    snapId = iServiceHandler->SnapIdL( aServiceId );
+    
+    if ( destHandler->IsSnapInUseL( snapId ) )
+        {
+        iConnectionHandler->StartListeningConnectionEvents();
+        User::Leave( KErrInUse );
+        }
+    
+    CleanupStack::PopAndDestroy( destHandler );
+    
+    CSCDEBUG( "CCSCAppUi::SnapCheckL - end" );  
+    }
+
+// ---------------------------------------------------------------------------
+// Check if GS has to be closed
+// ---------------------------------------------------------------------------
+//
+TBool CCSCAppUi::ExitGSIfParentL()
+    {
+    TBool ret = EFalse;
+    
+    RWsSession ws  = CEikonEnv::Static()->WsSession();
+    TApaTaskList taskList( ws );
+    TApaTask gstask = taskList.FindApp( KUidGS  );
+
+    if ( gstask.Exists() )
+        {
+        TInt gswgid = gstask.WgId();
+        RArray<RWsSession::TWindowGroupChainInfo> wgrp;
+        ws.WindowGroupList( &wgrp );
+        TInt i = 0;
+
+        // Loop window groups, find GS's child app
+        for ( i=0; i < wgrp.Count() ; ++i )
+            {
+            TBuf< KGSChildAppWindowGroupNameLength > name;
+            ws.GetWindowGroupNameFromIdentifier( wgrp[i].iId , name );
+            RWsSession::TWindowGroupChainInfo wginfo = wgrp[i];
+            if ( wginfo.iParentId == gswgid ) // Child of GS found
+                {
+                CApaWindowGroupName* windowName1 =
+                    CApaWindowGroupName::NewLC( ws, wginfo.iId ); // CS:1
+                TUid embeddeeuid;
+                embeddeeuid = windowName1->AppUid();
+
+                // Check if CSC is the child of GS
+                if ( KUidCSCApp == embeddeeuid )
+                    {
+                    ret = ETrue;
+                    gstask.EndTask();
+                    }
+                CleanupStack::PopAndDestroy( windowName1 );  // CS:0
+                }
+            }
+        wgrp.Close();
+        }
+    
+    return ret;
+    }
+
+// ---------------------------------------------------------------------------
+// Handle view change messages (e.g. from MeCo)
+// ---------------------------------------------------------------------------
+//
+MCoeMessageObserver::TMessageResponse CCSCAppUi::HandleMessageL(
+    TUint32 /*aClientHandleOfTargetWindowGroup*/, TUid aMessageUid,
+    const TDesC8& aMessageParameters )
+    {
+    CSCDEBUG( "CCSCAppUi::HandleMessageL - begin" ); 
+
+    MCoeMessageObserver::TMessageResponse ret = EMessageNotHandled;
+
+    if ( TUid::Uid( KUidApaMessageSwitchOpenFileValue ) == aMessageUid &&
+        aMessageParameters.Length() &&
+        aMessageParameters.Length() <= KMaxParamLength )
+        {
+        TBuf<KMaxParamLength> params;
+        params.Copy( aMessageParameters );  
+        iStartupHandler->SetStartupParametersL( params );
+            
+        iServiceView->InitializeWithStartupParametersL();
+        iServiceView->ExecuteStartupActionsL( EFalse, EFalse );
+        
+        ret = EMessageHandled;
+        }
+
+    CSCDEBUG( "CCSCAppUi::HandleMessageL - end" ); 
+    return ret;
+    }