diff -r 000000000000 -r a4daefaec16c commsconfig/cscengine/src/cscengservicepluginhandler.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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 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" ); + }