--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/profileplugin/src/caiprofileengine.cpp Wed Sep 01 12:22:09 2010 +0100
@@ -0,0 +1,698 @@
+/*
+* Copyright (c) 2005-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: The engine class of profile plugin.
+*
+*/
+
+
+// System includes
+#include <w32std.h>
+#include <ProEngFactory.h>
+#include <MProfileEngine.h>
+#include <MProfile.h>
+#include <MProEngEngine.h>
+#include <MProEngProfile.h>
+#include <MProEngProfileName.h>
+#include <MProEngProfileNameArray.h>
+#include <MProEngNotifyHandler.h>
+#include <Profile.hrh>
+#include <CProfileChangeNotifyHandler.h>
+#include <PUAcodes.hrh>
+#include <AknUtils.h>
+#include <data_caging_path_literals.hrh>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <AknQueryDialog.h>
+#include <aknnotewrappers.h>
+#include <RSSSettings.h>
+#include <startupdomainpskeys.h>
+
+// User includes
+#include <aiprofilepluginres.rsg>
+#include "caiprofileengine.h"
+#include "maiprofilepluginnotifier.h"
+#include "aiprofileplugincontentmodel.h"
+
+// Constants
+const TInt KMaxProfileNameLength( 64 );
+const TInt KGeneralProfileId( 0 );
+const TInt KSilentProfileId( 1 );
+const TInt KOfflineProfileId( 5 );
+
+const TInt KMaxActiveProfileLength( 64 );
+const TUid KUidProfileApp = { 0x100058F8 };
+const TUid KProfileAppSettingViewId = { 2 };
+
+_LIT( KAiProfilePluginResourceFileName, "z:aiprofilepluginres.rsc");
+
+// ============================ MEMBER FUNCTIONS ==============================
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::CAiProfileEngine
+//
+// ----------------------------------------------------------------------------
+//
+CAiProfileEngine::CAiProfileEngine(
+ MAiProfilePluginNotifier* aProfilePluginNotifier )
+ : iProfilePluginNotifier ( aProfilePluginNotifier ),
+ iResourceLoader( *CCoeEnv::Static() )
+ {
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::NewL
+//
+// ----------------------------------------------------------------------------
+//
+CAiProfileEngine* CAiProfileEngine::NewL(
+ MAiProfilePluginNotifier* aProfilePluginNotifier )
+ {
+ CAiProfileEngine* self =
+ new( ELeave ) CAiProfileEngine( aProfilePluginNotifier );
+ CleanupStack::PushL( self );
+
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::ConstructL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::ConstructL()
+ {
+ TParse parse;
+ parse.Set( KAiProfilePluginResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL );
+ TFileName fileName( parse.FullName() );
+
+ // Get language of resource file.
+ BaflUtils::NearestLanguageFile( CCoeEnv::Static()->FsSession(), fileName );
+
+ // Open resource file.
+ TRAP_IGNORE( iResourceLoader.OpenL( fileName ) );
+
+ User::LeaveIfError( iSSSettings.Open() );
+
+ // Register to listen ALS activation, if ALS status changes,
+ // profile must be republished.
+ TInt err( iSSSettings.Register( ESSSettingsAls, *this ) );
+
+ if( err == KErrNotSupported || err == KErrAlreadyExists )
+ {
+ // ALS not supported or already registered, that's fine
+ err = KErrNone;
+ }
+
+ User::LeaveIfError( err );
+
+ iProfileEngine = ProEngFactory::NewEngineL();
+
+ // Start to listen profile changes.
+ iProfileNotifier = ProEngFactory::NewNotifyHandlerL();
+
+ iProfileNotifier->RequestActiveProfileNotificationsL( *this );
+ iProfileNotifier->RequestProfileNameArrayNotificationsL( *this );
+ iProfileNotifier->RequestProfileActivationNotificationsL( *this );
+
+ DetermineTimedAndSilentStatesL();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::~CAiProfileEngine
+//
+// ----------------------------------------------------------------------------
+//
+CAiProfileEngine::~CAiProfileEngine()
+ {
+ delete iOfflineQueryDialog;
+ iOfflineQueryDialog = NULL;
+
+ iSSSettings.CancelAll( *this );
+ iSSSettings.Close();
+
+ delete iActiveProfileName;
+ delete iSwapProfileName;
+
+ iProfileNamePointerArray.ResetAndDestroy();
+
+ if ( iProfileNotifier )
+ {
+ iProfileNotifier->CancelAll();
+ }
+
+ delete iProfileNotifier;
+
+ if( iProfileEngine )
+ {
+ iProfileEngine->Release();
+ }
+
+ iResourceLoader.Close();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::DetermineTimedAndSilentStatesL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::DetermineTimedAndSilentStatesL()
+ {
+ iTimed = EFalse;
+ iSilent = EFalse;
+
+ MProfileEngine* engine = CreateProfileEngineL();
+
+ iTimed = engine->IsActiveProfileTimedL();
+
+ MProfile* profile = engine->ActiveProfileLC();
+
+ iSilent = profile->IsSilent();
+
+ CleanupStack::PopAndDestroy(); // profile
+
+ engine->Release();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::UpdateProfileNamesL()
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::UpdateProfileNamesL()
+ {
+ // Update active profile name
+ MProEngProfile* profile( iProfileEngine->ActiveProfileLC() );
+
+ const MProEngProfileName& name( profile->ProfileName() );
+
+ HBufC* activeProfileName( name.Name().AllocLC() );
+
+ SetActiveProfileNameL( *activeProfileName );
+
+ // Update profile name list
+ MProEngProfileNameArray* profileNamesArray(
+ iProfileEngine->ProfileNameArrayLC() );
+
+ SetProfileNameListL( *profileNamesArray );
+
+ // Update swap profile name
+ HBufC* swapProfileName( NULL );
+
+ TInt activeProfileId( iProfileEngine->ActiveProfileId() );
+
+ if( activeProfileId == KSilentProfileId )
+ {
+ TInt generalProfileIndex(
+ profileNamesArray->FindById( KGeneralProfileId ) );
+
+ if( generalProfileIndex > KErrNotFound )
+ {
+ swapProfileName =
+ profileNamesArray->MdcaPoint( generalProfileIndex ).AllocLC() ;
+ }
+ }
+ else
+ {
+ TInt silentProfileIndex(
+ profileNamesArray->FindById( KSilentProfileId ) );
+
+ if( silentProfileIndex > KErrNotFound )
+ {
+ swapProfileName =
+ profileNamesArray->MdcaPoint( silentProfileIndex ).AllocLC() ;
+ }
+ }
+
+ if( swapProfileName )
+ {
+ HBufC* activateProfileString( StringLoader::LoadLC(
+ R_AI_PERS_PROF_TOGGLE, swapProfileName->Des() ) );
+
+ SetSwapProfileNameL( *activateProfileString );
+
+ CleanupStack::PopAndDestroy( 2 ); // swapProfileName, activateProfileString
+ }
+
+ CleanupStack::PopAndDestroy( 3 ); //profile, profileName, profileNamesArray,
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::ShowOfflineMessageL
+//
+// ----------------------------------------------------------------------------
+//
+TBool CAiProfileEngine::ShowOfflineMessageL()
+ {
+ TInt result( ETrue );
+
+ TInt simCardStatus( ESimNotPresent );
+
+ RProperty simStatus;
+ User::LeaveIfError( simStatus.Attach( KPSUidStartup, KPSSimStatus ) );
+ User::LeaveIfError( simStatus.Get( simCardStatus ) );
+ simStatus.Close();
+
+ if ( simCardStatus == ESimNotPresent )
+ {
+ // SIM card does not exist.
+ HBufC* infoNoteText = StringLoader::LoadLC( R_SU_NOTE_INSERT_SIM_AND_RESTART );
+
+ CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
+ note->ExecuteLD( *infoNoteText );
+
+ CleanupStack::PopAndDestroy( infoNoteText );
+
+ result = EFalse;
+ }
+ else
+ {
+ if ( iOfflineQueryDialog == NULL )
+ {
+ iOfflineQueryDialog = CAknQueryDialog::NewL();
+ result = iOfflineQueryDialog->ExecuteLD( R_AI_LEAVE_OFFLINE_MODE_QUERY );
+ iOfflineQueryDialog = NULL;
+ }
+ }
+
+ return result;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::SetActiveProfileNameL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::SetActiveProfileNameL( const TDesC& aName )
+ {
+ HBufC* temp( aName.AllocL() );
+
+ TPtr profileNamePtr( temp->Des() );
+
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( profileNamePtr );
+
+ delete iActiveProfileName;
+ iActiveProfileName = NULL;
+
+ iActiveProfileName = temp;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::ActiveProfileName
+//
+// ----------------------------------------------------------------------------
+//
+const TDesC& CAiProfileEngine::ActiveProfileName() const
+ {
+ if( iActiveProfileName )
+ {
+ return *iActiveProfileName;
+ }
+
+ return KNullDesC();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::SetSwapProfileNameL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::SetSwapProfileNameL( const TDesC& aName )
+ {
+ HBufC* temp( aName.AllocL() );
+
+ TPtr profileNamePtr( temp->Des() );
+
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( profileNamePtr );
+
+ delete iSwapProfileName;
+ iSwapProfileName = NULL;
+
+ iSwapProfileName = temp;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::SwapProfileName
+//
+// ----------------------------------------------------------------------------
+//
+const TDesC& CAiProfileEngine::SwapProfileName() const
+ {
+ if( iSwapProfileName )
+ {
+ return *iSwapProfileName;
+ }
+
+ return KNullDesC();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::SetProfileNameListL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::SetProfileNameListL(
+ const MProEngProfileNameArray& aArray )
+ {
+ iProfileNamePointerArray.ResetAndDestroy();
+
+ const TInt count( aArray.MdcaCount() );
+
+ TBufC<KMaxProfileNameLength> profileName;
+
+ for ( TInt i = 0; i < count; i++ )
+ {
+ profileName = aArray.MdcaPoint( i );
+
+ TPtr profileNamePtr( profileName.Des() );
+
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion(
+ profileNamePtr );
+
+ HBufC* profile( profileNamePtr.AllocLC() );
+
+ iProfileNamePointerArray.AppendL( profile );
+ CleanupStack::Pop( profile );
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::ProfileNameByIndex
+//
+// ----------------------------------------------------------------------------
+//
+const TDesC& CAiProfileEngine::ProfileNameByIndex( TInt aIndex ) const
+ {
+ TInt count( iProfileNamePointerArray.Count() );
+
+ if( aIndex < count && aIndex >= 0 )
+ {
+ return *iProfileNamePointerArray[ aIndex ];
+ }
+
+ return KNullDesC();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::IsActiveProfileSilentL
+//
+// ----------------------------------------------------------------------------
+//
+TBool CAiProfileEngine::IsActiveProfileSilentL() const
+ {
+ return iSilent;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::IsActiveProfileTimedL
+//
+// ----------------------------------------------------------------------------
+//
+TBool CAiProfileEngine::IsActiveProfileTimedL() const
+ {
+ return iTimed;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::NumberOfProfiles
+//
+// ----------------------------------------------------------------------------
+//
+TInt CAiProfileEngine::NumberOfProfiles() const
+ {
+ return iProfileNamePointerArray.Count();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleAiEventL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleAiEventL( TInt aEvent, const TDesC& aParam )
+ {
+ switch ( aEvent )
+ {
+ case EAiProfileEventSwitchByIndex:
+ HandleSwitchByIndexL( aParam );
+ break;
+
+ case EAiProfileEventSwitchByName:
+ HandleSwitchByNameL( aParam );
+ break;
+
+ case EAiProfileEventSwap:
+ HandleSwapL( aParam );
+ break;
+
+ case EAiProfileEditActive:
+ HandleEditActiveProfileL();
+ break;
+
+ default:
+ break;
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleSwitchByIndexL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleSwitchByIndexL( const TDesC& aParam )
+ {
+ if ( aParam.Length() > 0 )
+ {
+ TInt index( KErrNotFound );
+ TPtrC ptr( aParam );
+ TLex lexer( ptr );
+
+ TInt err( lexer.Val( index ) );
+
+ if ( err == KErrNone )
+ {
+ MProEngProfileNameArray* profileNamesArray(
+ iProfileEngine->ProfileNameArrayLC() );
+
+ TInt profileId( profileNamesArray->ProfileId( index ) );
+
+ if ( profileId != KErrNotFound )
+ {
+ SetActiveProfileL( profileId );
+ }
+
+ CleanupStack::PopAndDestroy();
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleSwitchByNameL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleSwitchByNameL( const TDesC& aParam )
+ {
+ if ( aParam.Length() > 0 )
+ {
+ MProEngProfileNameArray* profileNamesArray(
+ iProfileEngine->ProfileNameArrayLC() );
+
+ TInt index( profileNamesArray->FindByName( aParam ) );
+
+ if( index != KErrNotFound )
+ {
+ SetActiveProfileL( profileNamesArray->ProfileId( index ) );
+ }
+
+ CleanupStack::PopAndDestroy();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleSwapL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleSwapL( const TDesC& aParam )
+ {
+ if ( aParam.Length() > 0 )
+ {
+ TInt profileId( KErrNotFound );
+ TPtrC ptr( aParam );
+ TLex lexer( ptr );
+
+ TInt err( lexer.Val( profileId ) );
+
+ if ( err == KErrNone )
+ {
+ TInt activeProfile( iProfileEngine->ActiveProfileId() );
+
+ if( activeProfile != profileId )
+ {
+ MProEngProfileNameArray* profileNamesArray(
+ iProfileEngine->ProfileNameArrayLC() );
+
+ profileId = profileNamesArray->FindById( profileId );
+
+ if( profileId != KErrNotFound )
+ {
+ SetActiveProfileL( profileId );
+ }
+
+ CleanupStack::PopAndDestroy();
+ }
+ else
+ {
+ SetActiveProfileL( KGeneralProfileId );
+ }
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleEditActiveProfileL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleEditActiveProfileL()
+ {
+ RWsSession ws;
+ User::LeaveIfError( ws.Connect() );
+ CleanupClosePushL( ws );
+
+ // Find the task with uid
+ TApaTaskList taskList( ws );
+ TApaTask task( taskList.FindApp( KUidProfileApp ) );
+
+ if ( task.Exists() )
+ {
+ task.EndTask();
+ User::After( 500000 );
+ }
+
+ CleanupStack::PopAndDestroy( &ws );
+
+ TVwsViewId viewid( KUidProfileApp, KProfileAppSettingViewId );
+
+ TInt profileId( iProfileEngine->ActiveProfileId() );
+
+ TBuf8<KMaxActiveProfileLength> buf;
+ buf.AppendNum( profileId );
+
+ CEikonEnv::Static()->AppUi()->ActivateViewL(
+ viewid, KProfileAppSettingViewId, buf );
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::SetActiveProfileL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::SetActiveProfileL( const TInt aProfileId )
+ {
+ TInt activeProfileId( iProfileEngine->ActiveProfileId() );
+
+ if ( activeProfileId == KOfflineProfileId &&
+ aProfileId != KOfflineProfileId )
+ {
+ if( !ShowOfflineMessageL() )
+ {
+ // User doesn't want to activate RF or
+ // SIM card does not exist.
+ return;
+ }
+ }
+
+ iProfileEngine->SetActiveProfileL( aProfileId );
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::IsOffline
+//
+// ----------------------------------------------------------------------------
+//
+TBool CAiProfileEngine::IsOffline() const
+ {
+ return iProfileEngine->ActiveProfileId() == KOfflineProfileId;
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::PhoneSettingChanged
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::PhoneSettingChanged( TSSSettingsSetting aSetting,
+ TInt /*aNewValue*/ )
+ {
+ if( aSetting == ESSSettingsAls )
+ {
+ NotifyContentUpdate();
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleActiveProfileModifiedL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleActiveProfileModifiedL()
+ {
+ DetermineTimedAndSilentStatesL();
+
+ NotifyContentUpdate();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleProfileNameArrayModificationL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleProfileNameArrayModificationL()
+ {
+ NotifyContentUpdate();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::HandleProfileActivatedL
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleProfileActivatedL( TInt /*aProfileId*/ )
+ {
+ // prevents duplicate offline notes on the screen.
+ if ( iOfflineQueryDialog )
+ {
+ delete iOfflineQueryDialog;
+ iOfflineQueryDialog = NULL;
+ }
+
+ DetermineTimedAndSilentStatesL();
+
+ NotifyContentUpdate();
+ }
+
+// ----------------------------------------------------------------------------
+// CAiProfileEngine::NotifyContentUpdate
+//
+// ----------------------------------------------------------------------------
+//
+void CAiProfileEngine::NotifyContentUpdate()
+ {
+ TRAP_IGNORE( UpdateProfileNamesL() );
+
+ iProfilePluginNotifier->NotifyContentUpdate();
+ }
+
+// End of file