idlefw/plugins/profileplugin/src/caiprofileengine.cpp
changeset 0 79c6a41cd166
child 8 d0529222e3f0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/idlefw/plugins/profileplugin/src/caiprofileengine.cpp	Thu Dec 17 08:54:17 2009 +0200
@@ -0,0 +1,580 @@
+/*
+* 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. 
+*
+*/
+
+
+// INCLUDE FILES
+#include "caiprofileengine.h"
+#include "maiprofilepluginnotifier.h"
+#include "aiprofileplugincontentmodel.h"
+
+#include <w32std.h> 
+#include <MProfileEngine.h>
+#include <MProfile.h>
+#include <MProfilesNamesArray.h>
+#include <MProfileName.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 <aiprofilepluginres.rsg>
+
+#include <startupdomainpskeys.h>
+
+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 ===============================
+// ---------------------------------------------------------
+// Default constructor
+// ---------------------------------------------------------
+//
+CAiProfileEngine::CAiProfileEngine( MAiProfilePluginNotifier* aProfilePluginNotifier ) :
+    iProfilePluginNotifier ( aProfilePluginNotifier ),
+    iResourceLoader( *CCoeEnv::Static() )
+    {
+    }
+    
+// ---------------------------------------------------------
+// Two-phased constructor.
+// Create instance of concrete ECOM interface implementation
+// ---------------------------------------------------------
+//
+CAiProfileEngine* CAiProfileEngine::NewL( MAiProfilePluginNotifier* aProfilePluginNotifier )
+    {
+    CAiProfileEngine* self = new( ELeave ) CAiProfileEngine( aProfilePluginNotifier );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// ---------------------------------------------------------
+// Symbian 2nd phase constructor can leave
+// ---------------------------------------------------------
+//
+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() );
+
+    iProfileEngine = CreateProfileEngineL();    
+   }
+    
+    
+// ---------------------------------------------------------
+// Destructor.
+// ---------------------------------------------------------
+//
+CAiProfileEngine::~CAiProfileEngine()
+    {
+    iSSSettings.CancelAll( *this );
+    iSSSettings.Close();
+    delete iProfileNotifier;
+	delete iActiveProfileName;
+	delete iSwapProfileName;
+	
+	if( iProfileNamePointerArray.Count() )
+    	{
+        iProfileNamePointerArray.ResetAndDestroy();
+        }
+
+    if( iProfileEngine )
+        {
+        iProfileEngine->Release();
+        }
+    
+    iResourceLoader.Close();            	 
+    }
+    
+// ---------------------------------------------------------
+// Updates profiles
+// ---------------------------------------------------------
+//
+void CAiProfileEngine::UpdateProfileNamesL()
+	{
+	//update active profile name
+	HBufC* activeProfileName = NULL;
+	
+	MProfile* profile = iProfileEngine->ActiveProfileLC();	
+	const MProfileName& name = profile->ProfileName();	
+	activeProfileName = name.Name().AllocLC();
+
+	SetActiveProfileNameL( *activeProfileName );
+      
+    //update profile name list	
+	MProfilesNamesArray* profileNamesArray = iProfileEngine->ProfilesNamesArrayLC();
+    
+    SetProfileNameListL( *profileNamesArray );
+    
+    //update swap profile name
+    HBufC* swapProfileName = NULL;
+    
+    TInt activeProfileId = iProfileEngine->ActiveProfileId();
+    
+    if( activeProfileId == KSilentProfileId )
+    	{
+        const MProfileName* generalProfileName = profileNamesArray->ProfileName( KGeneralProfileId );	
+		swapProfileName = generalProfileName->Name().AllocLC();	
+    	}
+    else
+        {
+        const MProfileName* silentProfileName = profileNamesArray->ProfileName( KSilentProfileId );	
+		swapProfileName = silentProfileName->Name().AllocLC();	
+        }
+    
+    TPtrC swapProfileNamePtr( *swapProfileName );
+	HBufC* activateProfileString = NULL;
+    activateProfileString = StringLoader::LoadLC( R_AI_PERS_PROF_TOGGLE, swapProfileNamePtr );    	
+    
+    SetSwapProfileNameL( *activateProfileString );
+
+    CleanupStack::PopAndDestroy( 5 ); //profile, profileName, profileNamesArray, swapProfileName, activateProfileString 
+	}
+
+// ---------------------------------------------------------
+// Checks SIM card status
+// ---------------------------------------------------------
+//
+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 );
+	    CAknInformationNote* note = new( ELeave ) CAknInformationNote( ETrue );
+	    note->ExecuteLD( *infoNoteText );
+	    CleanupStack::PopAndDestroy( infoNoteText );
+	    result = EFalse;	
+		}
+	else
+		{
+		CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+		result = dlg->ExecuteLD( R_AI_LEAVE_OFFLINE_MODE_QUERY );	
+		}
+       
+	return result;
+	}
+
+									  
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CAiProfileEngine::SetActiveProfileNameL( const TDesC& aName )
+    {
+    HBufC* temp = aName.AllocL();
+    delete iActiveProfileName;
+    iActiveProfileName = NULL;
+    TPtr profileNamePtr = temp->Des();
+    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( profileNamePtr );
+    iActiveProfileName = temp;  
+    }
+    
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+const TDesC& CAiProfileEngine::ActiveProfileName() const
+    {
+    if( iActiveProfileName )
+        {
+        return *iActiveProfileName;
+        }
+    
+    return KNullDesC();
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+void CAiProfileEngine::SetSwapProfileNameL( const TDesC& aName )
+    {
+    HBufC* temp = aName.AllocL();
+    delete iSwapProfileName;
+    iSwapProfileName = NULL;
+    TPtr profileNamePtr = temp->Des();
+    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( profileNamePtr );
+    iSwapProfileName = temp;  
+    }
+    
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+const TDesC& CAiProfileEngine::SwapProfileName() const
+    {
+    if( iSwapProfileName )
+        {
+        return *iSwapProfileName;
+        }
+    
+    return KNullDesC();
+    }
+
+
+// ---------------------------------------------------------
+// Set profile names
+// ---------------------------------------------------------
+//
+void CAiProfileEngine::SetProfileNameListL( const MProfilesNamesArray& aArray )
+    {
+    if( iProfileNamePointerArray.Count() )
+    	{
+        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();
+    	User::LeaveIfError( iProfileNamePointerArray.Append( profile ));
+    	CleanupStack::Pop( profile );
+    	}
+    }
+    
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+const TDesC& CAiProfileEngine::ProfileNameByIndex( TInt aIndex ) const
+    {
+ 	if( iProfileNamePointerArray.Count() )
+ 		{
+ 		return *iProfileNamePointerArray[aIndex];
+ 		}
+ 	
+ 	return KNullDesC();
+    }
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+TBool CAiProfileEngine::IsActiveProfileSilentL()
+	{
+	TBool isSilent = EFalse;
+	MProfile* profile = iProfileEngine->ActiveProfileLC();
+	isSilent = profile->IsSilent();
+	CleanupStack::PopAndDestroy();
+	return isSilent; 
+	}
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+TBool CAiProfileEngine::IsActiveProfileTimedL()
+	{
+	return iProfileEngine->IsActiveProfileTimedL();
+	}
+
+// ---------------------------------------------------------
+// Number of profiles
+// ---------------------------------------------------------
+//
+TInt CAiProfileEngine::NumberOfProfiles()
+	{	
+	return iProfileNamePointerArray.Count();
+	}
+
+
+// ---------------------------------------------------------
+// 
+// ---------------------------------------------------------
+//
+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;
+        }
+	}
+
+
+// -----------------------------------------------------------------------------
+// Handles profile switch by index event
+// -----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleSwitchByIndexL( const TDesC& aParam )
+	{
+    if ( aParam.Length() > 0 )
+    	{
+        TInt profileId = KErrNotFound;
+		TPtrC ptr( aParam );
+		TLex lexer( ptr );
+			
+    	TInt err = lexer.Val( profileId );  
+		if ( err == KErrNone )
+			{
+			MProfilesNamesArray* profileNamesArray = iProfileEngine->ProfilesNamesArrayLC();
+			const MProfileName* profileName = profileNamesArray->ProfileName( profileId );
+		 
+		    if( profileName )
+        		{
+	            profileId = profileName->Id();
+		    	SetActiveProfileL( profileId );
+        		}
+		    
+		    CleanupStack::PopAndDestroy();
+		   	}
+    	}
+	}
+
+// -----------------------------------------------------------------------------
+// Handles profile switch by name event
+// -----------------------------------------------------------------------------
+//
+void CAiProfileEngine::HandleSwitchByNameL( const TDesC& aParam )
+	{
+    if ( aParam.Length() > 0 )
+    	{
+    	TInt profileId = KErrNotFound;
+        MProfilesNamesArray* profileNamesArray = iProfileEngine->ProfilesNamesArrayLC();
+        profileId = profileNamesArray->FindByName( aParam );
+        if( profileId != KErrNotFound )
+        	{
+        	SetActiveProfileL( profileId );
+        	}
+    	
+    	CleanupStack::PopAndDestroy();
+    	}
+	}
+
+// -----------------------------------------------------------------------------
+// Handles profile swap event
+// -----------------------------------------------------------------------------
+//
+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 )
+				{
+				MProfilesNamesArray* profileNamesArray = iProfileEngine->ProfilesNamesArrayLC();
+        		profileId = profileNamesArray->FindById( profileId );
+		    
+		    	if( profileId != KErrNotFound )
+        			{
+		    		TRAP_IGNORE( SetActiveProfileL( profileId ) );
+        			}
+        		
+        		CleanupStack::PopAndDestroy();	
+				}
+			else
+				{
+				SetActiveProfileL( KGeneralProfileId );	
+				}
+		   	}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// Handles edit active profile event
+// -----------------------------------------------------------------------------
+//
+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);
+    
+
+    }
+
+// -----------------------------------------------------------------------------
+//  Set active profile
+// -----------------------------------------------------------------------------
+//
+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 );   	
+ 	}
+		
+// ---------------------------------------------------------------------------
+// Resumes the engine
+// ---------------------------------------------------------------------------
+//
+void CAiProfileEngine::ResumeL()
+    {
+    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 );
+
+	//Start to listen profile changes.
+	delete iProfileNotifier;
+    iProfileNotifier = NULL;	
+		
+    iProfileNotifier = CProfileChangeNotifyHandler::NewL( this );
+   	}
+
+// ---------------------------------------------------------------------------
+// Suspends the engine
+// ---------------------------------------------------------------------------
+//
+void CAiProfileEngine::Suspend()
+    {
+ 	iSSSettings.CancelAll( *this );
+    iSSSettings.Close();
+   	delete iProfileNotifier;
+   	iProfileNotifier = NULL;	
+    }
+
+// ---------------------------------------------------------------------------
+// From class MProfileChangeObserver
+// ---------------------------------------------------------------------------
+//
+
+void CAiProfileEngine::HandleActiveProfileEventL(
+							TProfileEvent aProfileEvent,
+							TInt /*aProfileId*/ )
+    {
+	//Profile activated or modified.
+    if( ( aProfileEvent == EProfileNewActiveProfile ) ||
+    	( aProfileEvent == EProfileActiveProfileModified ) )
+        {
+        UpdateProfileNamesL();
+        iProfilePluginNotifier->NotifyContentUpdate();
+        }
+    }
+    
+// ---------------------------------------------------------------------------
+// From class MSSSettingsObserver.
+// ---------------------------------------------------------------------------
+//
+void CAiProfileEngine::PhoneSettingChanged( 
+								TSSSettingsSetting aSetting,
+								TInt /*aNewValue*/ )
+    {
+    if( aSetting == ESSSettingsAls )
+        {
+        TRAP_IGNORE( UpdateProfileNamesL() );
+        iProfilePluginNotifier->NotifyContentUpdate();
+        }
+    }
+
+
+TBool CAiProfileEngine::IsOffline()
+	{
+	return iProfileEngine->ActiveProfileId() == KOfflineProfileId;
+	}
+