--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/cscengine/src/cscengservicepluginhandler.cpp Wed Sep 01 12:29:57 2010 +0100
@@ -0,0 +1,681 @@
+/*
+* 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 );
+
+ // Check if the plugin is already in array before appending.
+ TBool found( EFalse );
+ for ( TInt counter( 0 );
+ counter < iServicePluginInfoArray.Count();
+ counter++ )
+ {
+ if ( iServicePluginInfoArray[counter].iPluginsUid ==
+ pluginInfo.iPluginsUid )
+ {
+ found = ETrue;
+ }
+ }
+ if ( !found )
+ {
+ 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" );
+ }