commsconfig/cscengine/src/cscengservicepluginhandler.cpp
changeset 0 a4daefaec16c
child 12 876a3df1f464
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/cscengine/src/cscengservicepluginhandler.cpp	Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,666 @@
+/*
+* Copyright (c) 2007-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:  For CSC needed AIW handling for service plug-ins
+*
+*/
+
+
+#include <eikenv.h>
+#include <bautils.h>
+#include <pathinfo.h>
+#include <ecom/ecom.h>
+#include <SWInstApi.h>
+#include <SWInstDefs.h>
+#include <AiwCommon.hrh>
+#include <cscengine.rsg>
+#include <AiwServiceHandler.h>
+#include <mspnotifychangeobserver.h>
+#include <data_caging_path_literals.hrh>
+
+#include "cscenglogger.h"
+#include "cscengecommonitor.h"
+#include "cscengservicehandler.h"
+#include "cscengservicepluginhandler.h"
+#include "mcscengprovisioningobserver.h"
+
+// Resource file location.
+_LIT( KCSCEngineResourceFile, "cscengine.rsc" ); // file
+
+const TInt KMandatoryParamCount = 3;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCEngServicePluginHandler::CCSCEngServicePluginHandler(
+    CEikonEnv& aEikEnv,
+    MCSCEngProvisioningObserver& aObserver,
+    CCSCEngServiceHandler& aServiceHandler ) :
+    iEikEnv( aEikEnv ),
+    iObserver( aObserver ),
+    iServiceHandler( aServiceHandler )
+    {
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServicePluginHandler::ConstructL()
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::ConstructL - begin" );
+
+    // Attach to AIW Framework.
+    iAiwServiceHandler = CAiwServiceHandler::NewL();  
+    
+    // Load resource file to the memory.    
+    TFileName resourceFile = TParsePtrC( PathInfo::RomRootPath() ).Drive();
+    resourceFile.Append( KDC_RESOURCE_FILES_DIR );
+    resourceFile.Append( KCSCEngineResourceFile );
+    BaflUtils::NearestLanguageFile( iEikEnv.FsSession(), resourceFile );
+    iResourceOffset = iEikEnv.AddResourceFileL( resourceFile );
+        
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::ConstructL - end" );
+    }
+    
+    
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCSCEngServicePluginHandler* CCSCEngServicePluginHandler::NewL(
+    CEikonEnv& aEikEnv,
+    MCSCEngProvisioningObserver& aObserver,
+    CCSCEngServiceHandler& aServiceHandler )
+    {
+    CCSCEngServicePluginHandler* self =
+        CCSCEngServicePluginHandler::NewLC( 
+            aEikEnv, aObserver, aServiceHandler );
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCSCEngServicePluginHandler* CCSCEngServicePluginHandler::NewLC(
+    CEikonEnv& aEikEnv,
+    MCSCEngProvisioningObserver& aObserver,
+    CCSCEngServiceHandler& aServiceHandler )
+    {
+    CCSCEngServicePluginHandler* self =
+        new ( ELeave ) CCSCEngServicePluginHandler( 
+            aEikEnv, aObserver, aServiceHandler );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCEngServicePluginHandler::~CCSCEngServicePluginHandler()
+    {
+    CSCENGDEBUG( 
+    	"CCSCEngServicePluginHandler::~CCSCEngServicePluginHandler - begin" );
+    
+    iEikEnv.DeleteResourceFile( iResourceOffset );
+    iServicePluginInfoArray.Reset();
+    iServicePluginInfoArray.Close();      
+    delete iEcomMonitor;
+    delete iAiwServiceHandler;
+    
+    CSCENGDEBUG( 
+    	"CCSCEngServicePluginHandler::~CCSCEngServicePluginHandler - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Initializes CSC supported plugins.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServicePluginHandler::InitializePluginsL()
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::InitializePluginsL - begin" );
+
+    // Reset service plugin info array.
+    iServicePluginInfoArray.Reset();
+
+    // Attach to CSC supported plugins and execute initalization.
+    iAiwServiceHandler->AttachL( R_CSCENG_INTEREST_SERVICE_PLUGIN );
+    iAiwServiceHandler->ExecuteServiceCmdL( 
+            KAiwCmdCSCServicePlugins,
+            iAiwServiceHandler->InParamListL(),
+            iAiwServiceHandler->OutParamListL(),
+            EPluginInitialize,
+            this );
+    
+    // Start monitoring service setup plugins.
+    if ( !iEcomMonitor )
+        {
+        iEcomMonitor = CCSCEngEcomMonitor::NewL( *this );
+        }
+        
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::InitializePluginsL - end" );
+    }
+
+// ---------------------------------------------------------------------------
+// Informs plugin of provisioning
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServicePluginHandler::DoProvisioningL(
+    const TUid& aPluginUid, const TUid& aViewUid )
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::DoProvisioningL - begin" );
+
+    // Set plugins Uid to generic param data.
+    CAiwGenericParamList& paramList = iAiwServiceHandler->OutParamListL();
+    TAiwVariant variant( aPluginUid );
+    TAiwGenericParam genericParamUid( EGenericParamError, variant );
+    paramList.AppendL( genericParamUid );
+
+    // Set view id to be returned to generic param data.
+    variant.Reset();
+    variant.Set( aViewUid );
+    TAiwGenericParam genericParamViewId( EGenericParamError, variant );
+    paramList.AppendL( genericParamViewId );
+
+    // Set bogus iap id to maintain backwards compatibility with older service
+    // plugins
+    TUint32 bogusIap( KErrNone );
+
+    variant.Reset();
+    variant.Set( bogusIap );
+    TAiwGenericParam genericParamIap( EGenericParamError, variant );
+    paramList.AppendL( genericParamIap );
+
+    // Execute service handler command.
+    iAiwServiceHandler->ExecuteServiceCmdL( KAiwCmdCSCServicePlugins,
+                                         iAiwServiceHandler->InParamListL(),
+                                         paramList,
+                                         EPluginProvisioning,
+                                         this );
+
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::DoProvisioningL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Launches plugin provided setting view.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServicePluginHandler::LaunchPluginViewL(
+    const TUid& aPluginUid, const TUid& aViewUid )
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::LaunchPluginViewL - begin" );
+
+    // Set plugins Uid to generic param data.
+    CAiwGenericParamList& paramList = iAiwServiceHandler->OutParamListL();
+    TAiwVariant variant( aPluginUid );
+    TAiwGenericParam genericParamUid( EGenericParamError, variant );
+    paramList.AppendL( genericParamUid );
+
+    // Set view id to be returned to generic param data.
+    variant.Reset();
+    variant.Set( aViewUid );
+    TAiwGenericParam genericParamViewId( EGenericParamError, variant );
+    paramList.AppendL( genericParamViewId );
+
+    // Execute service handler command.
+    iAiwServiceHandler->ExecuteServiceCmdL( KAiwCmdCSCServicePlugins,
+                                         iAiwServiceHandler->InParamListL(),
+                                         paramList,
+                                         EPluginModifySettings,
+                                         this );
+
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::LaunchPluginViewL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Informs plugin from removation.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServicePluginHandler::DoRemovationL(
+    const TUid& aPluginUid, TBool aDeleteSisPckg )
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::DoRemovationL - begin" );
+
+    // Set flag for application installer launching.
+    iRunSwinst = aDeleteSisPckg;
+
+    // Set plugins Uid to generic param data.
+    CAiwGenericParamList& paramList = iAiwServiceHandler->OutParamListL();
+    TAiwVariant variant( aPluginUid );
+    TAiwGenericParam genericParamUid( EGenericParamError, variant );
+    paramList.AppendL( genericParamUid );
+
+    // Execute service handler command.
+    iAiwServiceHandler->ExecuteServiceCmdL( KAiwCmdCSCServicePlugins,
+                                         iAiwServiceHandler->InParamListL(),
+                                         paramList,
+                                         EPluginRemovation,
+                                         this );
+
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::DoRemovationL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Returns plugin counts from PluginsInfoArray.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCSCEngServicePluginHandler::PluginCount( 
+    const TPluginCount aType ) const
+    {
+    TInt count( 0 );
+
+    for ( TInt i = 0; i < iServicePluginInfoArray.Count(); i++ )
+        {
+        switch ( aType )
+            {
+            // CSC supported and initialized plugin count.
+            case EInitialized:
+                count++;
+                break;
+            // CSC supported and unprovisioned plugin count.
+            case EUnprovisioned:
+                if ( !iServicePluginInfoArray[ i ].iProvisioned )
+                    {
+                    count++;
+                    }
+                break;
+            default:
+                break;
+            }
+        }
+
+    CSCENGDEBUG2( "CCSCEngServicePluginHandler::PluginCount: %d", count );
+
+    return count;
+    }
+
+
+// ---------------------------------------------------------------------------
+// Return item from serviceplugininfoarray.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TServicePluginInfo 
+    CCSCEngServicePluginHandler::ItemFromPluginInfoArray( TInt aIndex )
+    {
+    return iServicePluginInfoArray[ aIndex ];
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MAiwNotifyCallBack
+// Handles received callbacks from AIW plugin.
+// ---------------------------------------------------------------------------
+//
+TInt CCSCEngServicePluginHandler::HandleNotifyL(
+    TInt /*aCmdId*/,
+    TInt aEventId,
+    CAiwGenericParamList& /*aEventParamList*/,
+    const CAiwGenericParamList& aInParamList )
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::HandleNotifyL - begin");
+
+    TInt err( KErrNone );
+
+    switch ( aEventId )
+        {
+        // ===================================================================
+        // Every supported CSC plugin sends callback event when it has
+        // been initialized. Generic parameter include 3 different values.
+        // Initialization parameters are described in CSC Service Plugin
+        // interface description document:
+        // "Example Operator" <- Name shown to user
+        // "00"               <- First value 0 or 1 provides information
+        //                       whether Plugin has modifiable UI or not. This
+        //                       information is needed when provisioning
+        //                       control is given to Plugin.
+        //                    <- Second value presents information whether
+        //                       Plugin requires Active IAP in order to
+        //                       process provisioning.
+        // ===================================================================
+        case KAiwEventStarted:
+            {
+            CSCENGDEBUG(
+            "CCSCEngServicePluginHandler::HandleNotifyL - KAiwEventStarted" );
+
+            // Parse initialization data and append data to the infoarray.
+            SetPluginInitInfoL( aInParamList );
+            
+            TInt index( 0 );
+            TUid pluginUid( KNullUid );
+            
+            GetPluginIndexAndUid( aInParamList, index, pluginUid );
+            
+            iObserver.NotifyServicePluginResponse( 
+                EPluginInitialized, index, pluginUid );
+            break;
+            }
+
+        // ===================================================================
+        // Target plugins sends callback note when provisioning is finished.
+        // Generic parameter include 1 value.
+        // Initialization parameters are described in CSC Service Plugin
+        // interface description document:
+        // "TUid"             <- Plugins uid value [TUid]
+        // ===================================================================
+        case KAiwEventCompleted:
+            {            
+            TInt index( 0 );
+            TUid pluginUid( KNullUid );
+            
+            GetPluginIndexAndUid( aInParamList, index, pluginUid );
+            
+            if ( index < iServicePluginInfoArray.Count() )
+                {
+                iServicePluginInfoArray[ index ].iProvisioned = ETrue;
+                
+                iObserver.NotifyServicePluginResponse( 
+                    EPluginProvisioned, index, pluginUid );
+                }
+            
+            CSCENGDEBUG(
+            "CCSCEngServicePluginHandler::HandleNotifyL KAiwEventCompleted" );
+            break;
+            }
+
+        // ===================================================================
+        // Target plugins sends callback note when plugins modified ui is
+        // ready. Generic parameter include 1 value.
+        // Initialization parameters are described in CSC Service Plugin
+        // interface description document:
+        // "TUid"             <- Plugins uid value [TUid]
+        // ===================================================================
+        case KAiwEventStopped:
+            {
+            TInt index( 0 );
+            TUid pluginUid( KNullUid );
+            
+            GetPluginIndexAndUid( aInParamList, index, pluginUid );
+            
+            iObserver.NotifyServicePluginResponse( 
+               EPluginModified, index, pluginUid );
+                 
+            CSCENGDEBUG(
+              "CCSCEngServicePluginHandler::HandleNotifyL KAiwEventStopped" );
+            break;
+            }
+
+        // ===================================================================
+        // Target plugins sends callback note when plugins setting removation
+        // process is ready. Generic parameter include 1 value.
+        // Initialization parameters are described in CSC Service Plugin
+        // interface description document:
+        // "TUid"             <- Plugins uid value [TUid]
+        // ===================================================================
+        case KAiwEventQueryExit:
+            { 
+            TInt index( 0 );
+            TUid pluginUid( KNullUid );
+            
+            GetPluginIndexAndUid( aInParamList, index, pluginUid );
+            GetPluginViewId( aInParamList );
+            
+            if ( iRunSwinst )
+                {
+                // Try to remove .sis file from the device.
+                TRAP_IGNORE( RemovePluginSisL( pluginUid ) );
+                }
+                
+            iObserver.NotifyServicePluginResponse( 
+                EPluginRemoved, index, pluginUid );
+            
+            CSCENGDEBUG(
+            "CCSCEngServicePluginHandler::HandleNotifyL KAiwEventQueryExit" );   
+            break;
+            }
+
+        // ===================================================================
+        // Target plugins sends callback note if plugins provisioning failed.
+        // Generic parameter include 1 value.
+        // Initialization parameters are described in CSC Service Plugin
+        // interface description document:
+        // "TUid"             <- Plugins uid value [TUid]
+        // ===================================================================
+        case KAiwEventError:
+            {
+            TInt index( 0 );
+            TUid pluginUid( KNullUid );
+            
+            GetPluginIndexAndUid( aInParamList, index, pluginUid );
+            
+            iObserver.NotifyServicePluginResponse( 
+               EPluginError, index, pluginUid );
+
+            CSCENGDEBUG(
+                "CCSCEngServicePluginHandler::HandleNotifyL KAiwEventError" );
+            break;
+            }
+        default:
+            CSCENGDEBUG(
+                "CCSCEngServicePluginHandler::HandleNotifyL: !!DEFAULT!!" );
+            break;
+        }
+
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::HandleNotifyL - end" );
+
+    return err;
+    }
+
+
+// ---------------------------------------------------------------------------
+// From class MCSCEngEcomObserver
+// Observer interface for notifying ecom events.
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServicePluginHandler::NotifyEcomEvent()
+    {
+    // Re-initialize service setup plugins.
+    TRAP_IGNORE( InitializePluginsL() );
+    }
+
+
+// ---------------------------------------------------------------------------
+// For Getting plug-ins index in plug-in info array and plug-ins uid.
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServicePluginHandler::GetPluginIndexAndUid( 
+    const CAiwGenericParamList& aInParamList,
+    TInt& aIndex, 
+    TUid& aPluginUid )
+    {
+    const TAiwGenericParam* genericParam = NULL;
+
+    genericParam = aInParamList.FindFirst( aIndex,
+                                           EGenericParamError,
+                                           EVariantTypeTUid );
+
+    aPluginUid = genericParam->Value().AsTUid();
+
+    for ( TInt i = 0; i < iServicePluginInfoArray.Count(); i++ )
+        {
+        if ( aPluginUid == iServicePluginInfoArray[ i ].iPluginsUid )
+            {
+            aIndex = i;
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// For Getting and setting plug-ins view id.
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServicePluginHandler::GetPluginViewId( 
+    const CAiwGenericParamList& aInParamList )
+    {
+    const TAiwGenericParam* genericParam = NULL;
+    TUid pluginUid( KNullUid );
+    TUid viewId( KNullUid );
+    TInt index( 0 );
+    
+    // First is plug-in uid, not needed now
+    genericParam = aInParamList.FindFirst( index,
+                                           EGenericParamError,
+                                           EVariantTypeTUid );
+    
+    pluginUid = genericParam->Value().AsTUid();                              
+                                           
+    // Find next which is view id
+    genericParam = aInParamList.FindNext( index,
+                                          EGenericParamError,
+                                          EVariantTypeTUid );
+    
+    viewId = genericParam->Value().AsTUid();
+
+    for ( TInt i = 0; i < iServicePluginInfoArray.Count(); i++ )
+        {
+        if ( pluginUid == iServicePluginInfoArray[ i ].iPluginsUid )
+            {
+            iServicePluginInfoArray[ i ].iViewId = viewId;
+            break;
+            }
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// For parsing and settings plug-in initialization info
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServicePluginHandler::SetPluginInitInfoL(
+    const CAiwGenericParamList& aInParamList )
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::SetPluginInitInfoL - begin" );
+
+    if ( KMandatoryParamCount <= aInParamList.Count() )
+        {
+        TServicePluginInfo pluginInfo;
+        TInt index = 0;
+        
+        const TAiwGenericParam* genericParam = NULL;
+
+        // First generic value is plugin Uid.
+        genericParam = aInParamList.FindFirst( index,
+                                               EGenericParamError,
+                                               EVariantTypeTUid );
+
+        pluginInfo.iPluginsUid = genericParam->Value().AsTUid();
+
+        // Second generic value is plugin name.
+        genericParam = aInParamList.FindNext( index,
+                                              EGenericParamError,
+                                              EVariantTypeDesC );
+
+        pluginInfo.iProviderName.Copy( genericParam->Value().AsDes() );
+
+        CSCENGDEBUG2(
+         "CCSCEngServicePluginHandler::SetPluginInitInfoL: PROVIDER NAME: %S",
+             &pluginInfo.iProviderName );
+
+        // Third generic value is modified Ui and needed Iap.
+        genericParam = aInParamList.FindNext( index,
+                                              EGenericParamError,
+                                              EVariantTypeDesC8 );
+
+        TPtrC8 data = genericParam->Value().AsData();
+
+        TInt hasUi = 0;
+        TLex8 lexerUi( data.Left( 1 ) );
+        lexerUi.Val( hasUi );
+
+        pluginInfo.iModifiedUi = hasUi;
+
+        CSCENGDEBUG2(
+           "CCSCEngServicePluginHandler::SetPluginInitInfoL  Ui: %d", hasUi );
+
+        TInt reqIap = 0;
+        TLex8 lexerIap( data.Right( 1 ) );
+        lexerIap.Val( reqIap );
+
+        pluginInfo.iRequiredIap = reqIap;
+
+        CSCENGDEBUG2(
+         "CCSCEngServicePluginHandler::SetPluginInitInfoL  Iap: %d", reqIap );
+        
+        
+        // Check if plug-in is already provisioned
+        pluginInfo.iProvisioned = EFalse;
+        RArray<TUint> serviceIds;
+        CleanupClosePushL( serviceIds );
+        
+        TRAPD( err, iServiceHandler.GetAllServiceIdsL( serviceIds ) );
+         
+        for ( TInt i( 0 ) ; i < serviceIds.Count() && !err ; i++ )
+            {
+            TInt32 pluginUid( 0 );
+            TInt err2( KErrNone );
+            
+            TRAP( err2, pluginUid =
+                iServiceHandler.ServiceSetupPluginIdL( serviceIds[ i ] ) );
+                
+            
+            CSCENGDEBUG2(
+            "CCSCEngServicePluginHandler::SetPluginInitInfoL ERR=%d", err2 );
+            
+                        
+            if ( !err2 && ( pluginInfo.iPluginsUid.iUid == pluginUid ) )
+                {
+                pluginInfo.iProvisioned = ETrue;
+                }
+            }
+        
+        CleanupStack::PopAndDestroy( &serviceIds );
+        
+        iServicePluginInfoArray.Append( pluginInfo );
+        }
+        
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::SetPluginInitInfoL - end" );
+    }
+
+
+// ---------------------------------------------------------------------------
+// Invokes application installer to remove .sis from device.
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServicePluginHandler::RemovePluginSisL( 
+    const TUid& aPluginUid ) const
+    {
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::RemovePluginSisL - begin" );
+    
+    // Create & connect to the software installation server.
+    SwiUI::RSWInstSilentLauncher swInstaller;
+    CleanupClosePushL( swInstaller );
+    User::LeaveIfError( swInstaller.Connect() );
+    
+    // Make silent uninstall via sowtware installation server.
+    SwiUI::TInstallOptionsPckg uninstallOptions;
+    User::LeaveIfError( 
+        swInstaller.SilentUninstall( 
+            aPluginUid , 
+            uninstallOptions, 
+            SwiUI::KSisxMimeType ) );
+    
+    // Close & destroy server after uninstallation.
+    CleanupStack::PopAndDestroy( &swInstaller );
+        
+    CSCENGDEBUG( "CCSCEngServicePluginHandler::RemovePluginSisL - end" );
+    }