securitydialogs/SecUi/GSSimSecPlugin/Src/GSSimSecPlugin.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 00:44:34 +0200
changeset 1 d5423fbb4f29
parent 0 164170e6151a
child 7 6e226572c5f0
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2005 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:  View for Device & SIM Security sub-folder
*
*/


// INCLUDE FILES
#include <coeaui.h>
#include <hlplch.h>             // For HlpLauncher
#include <bautils.h>
#include <gulicon.h>
#include <eikfrlbd.h>
#include <eiktxlbx.h>
#include <aknradiobuttonsettingpage.h>
#include <aknPopup.h>
#include <aknlists.h>
#include <rsssettings.h>
#include <AknQueryDialog.h>
#include <aknnotedialog.h>
#include <aknViewAppUi.h>
#include <featmgr.h>
#include <StringLoader.h>
#include <secui.h>
#include <secuisecuritysettings.h>
#include <BTSapDomainPSKeys.h>
#include <e32property.h>

#include <GSSimSecPluginRsc.rsg>
#include <gsprivatepluginproviderids.h>
#include <gsmainview.h>
#include <gsbasecontainer.h>

#include "GSSimSecPlugin.h"
#include "GSSimSecPluginContainer.h"
#include "GSSimSecPlugin.hrh"


#ifdef RD_REMOTELOCK
#include    <RemoteLockSettings.h>  
#endif // RD_REMOTELOCK


// EXTERNAL DATA STRUCTURES

// EXTERNAL FUNCTION PROTOTYPES  

// CONSTANTS

// MACROS

// LOCAL CONSTANTS AND MACROS
const TInt KEmptyCugIndex( -100000000 );
_LIT( KGSSimSecPluginResourceFileName, "z:GSSimSecPluginRsc.rsc" );

// MODULE DATA STRUCTURES

// LOCAL FUNCTION PROTOTYPES

// FORWARD DECLARATIONS

/**
* CCugQuery
* It defines CCugQuery used in closed user group settings
*/
class CCugQuery
    : public CAknNumberQueryDialog
    {
    public: // Constructors and destructors
        /**
        * C++ constructor.
        */
        CCugQuery( TInt& aNumber,const TTone aTone = ENoTone );
    protected: // From base classes
        /**
        * From CCAknNumberQueryDialog Left softkey is allways OK.
        */
        void  UpdateLeftSoftKeyL();
    };

// ============================= LOCAL FUNCTIONS ==============================

// ========================= MEMBER FUNCTIONS =================================

// ---------------------------------------------------------------------------
// GSSimSecPlugin::NewL()
// 
// ---------------------------------------------------------------------------
CGSSimSecPlugin* CGSSimSecPlugin::NewL( TAny* /*aInitParams*/ )
    {
    CGSSimSecPlugin* self = new( ELeave ) CGSSimSecPlugin();
    
    CleanupStack::PushL( self );
    self->ConstructL();    
    CleanupStack::Pop( self );

    return self;
    }


// ---------------------------------------------------------------------------
// GSSimSecPlugin::CGSSimSecPlugin()
// 
// ---------------------------------------------------------------------------
CGSSimSecPlugin::CGSSimSecPlugin()
    : iResourceLoader( *iCoeEnv )
    {    
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::ConstructL()
// 
// Symbian OS two-phased constructor
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::ConstructL()
    {
    FeatureManager::InitializeLibL();

    iModel = CGSSimSecPluginModel::NewL();
    //PS listener initialization
    iBtSapListener = CGSPubSubsListener::NewL( 
                     KPSUidBluetoothSapConnectionState,
                     KBTSapConnectionState, this );

    iSecurity= CSecuritySettings::NewL();    
    if(!FeatureManager::FeatureSupported( KFeatureIdFfNoCugSupport ))
    {    
    	User::LeaveIfError( iCugSettings.Open() );
		}
    // Find the resource file
    TParse parse;
    parse.Set( KGSSimSecPluginResourceFileName, 
               &KDC_RESOURCE_FILES_DIR, NULL );
    TFileName fileName( parse.FullName() );
    
    // Get language of resource file
    BaflUtils::NearestLanguageFile( iCoeEnv->FsSession(), fileName );

    // Open resource file
    iResourceLoader.OpenL( fileName );
    
    BaseConstructL( R_GS_SIM_SECURITY_VIEW );

    // secui resource file
    TSecUi::InitializeLibL();
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::~CGSSettListSecurityView()
// 
// 
// ---------------------------------------------------------------------------
CGSSimSecPlugin::~CGSSimSecPlugin()
    {
    FeatureManager::UnInitializeLib();
    // close resource loader
    iResourceLoader.Close();
	if(!FeatureManager::FeatureSupported( KFeatureIdFfNoCugSupport ))
    { 
    iCugSettings.Close();
  	}
    if ( iSecurity )
        {
        delete iSecurity;
        }

    if ( iModel )
        {
        delete iModel;
        }
    delete iBtSapListener;

    TSecUi::UnInitializeLib();  
    }


// ---------------------------------------------------------------------------
// TUid CGSSettSimListSecurityView::Id()
// 
// 
// ---------------------------------------------------------------------------
TUid CGSSimSecPlugin::Id() const
    {
    return KGSSimSecPluginUid;
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::HandleCommandL()
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::HandleCommandL( TInt aCommand )
    {
    switch ( aCommand )
        {
        case EGSCmdAppChange:
        case EAknSoftkeyChange:
            {           
            const TInt currentFeatureId = Container()->CurrentFeatureId();

            if ( currentFeatureId != EGSSettIdSatOperations )
                {
                HandleListBoxSelectionL();
                }
            else
                {
                if(aCommand == EGSCmdAppChange)
                    SetSatWithSettingPageL();
                else //user pressed MSK, don't show setting page.
                    SetSatOperationsL();
                }
            }
            break;
        case EAknSoftkeyBack:
            iAppUi->ActivateLocalViewL( KGSSecurityPluginUid );  
            break;
        case EAknCmdHelp:
            {
            if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
                {
                HlpLauncher::LaunchHelpApplicationL(
                    iEikonEnv->WsSession(), iAppUi->AppHelpContextL() );
                }
            }
            break;
        default:
            iAppUi->HandleCommandL( aCommand );
            break;
        }
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::UpdateListBoxL
// 
// Update the current item in the listbox.
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::UpdateListBoxL( TInt aItemId )
    {
    Container()->UpdateListBoxL( aItemId );
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::DoActivateL(...)
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::DoActivateL( const TVwsViewId& aPrevViewId, 
                                   TUid aCustomMessageId, 
                                   const TDesC8& aCustomMessage )
    {
    CGSBaseView::DoActivateL( aPrevViewId, aCustomMessageId, aCustomMessage );    
    }


// ----------------------------------------------------------------------------
// CGSSimSecPlugin::Container
// 
// Return handle to container class.
// ----------------------------------------------------------------------------
//
CGSSimSecPluginContainer* CGSSimSecPlugin::Container()
    {
    return static_cast<CGSSimSecPluginContainer*>( iContainer );
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::NewContainerL()
// 
// Creates new iContainer.
// ---------------------------------------------------------------------------
//
void CGSSimSecPlugin::NewContainerL()
    {
    iContainer = new( ELeave ) CGSSimSecPluginContainer( iModel );
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::HandleListBoxSelectionL()
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::HandleListBoxSelectionL() 
    {
    const TInt currentFeatureId = Container()->CurrentFeatureId();
    TBool wcdmaSupported(FeatureManager::FeatureSupported( KFeatureIdProtocolWcdma ));
    TBool upinSupported(FeatureManager::FeatureSupported( KFeatureIdUpin ));
    switch ( currentFeatureId )
        {
        case EGSSettIdCodeInUse:
            if(wcdmaSupported || upinSupported)
                {
	                if(iSecurity->SwitchPinCodesL())
	                {
	                	UpdateListBoxL( currentFeatureId );
	              	}
                }       
            break;
        case EGSSettIdUpinRequest:
            if(wcdmaSupported || upinSupported)
                 {
                    if(iSecurity->ChangeUPinRequestL())
                    {            
                    	UpdateListBoxL( currentFeatureId );
                    }
                 }
            break;
        case EGSSettIdUpinCode:
            if(wcdmaSupported || upinSupported)
              {
                  iSecurity->ChangeUPinL();
              }
            break;
        case EGSSettIdPinRequest: 
        		if(iSecurity->ChangePinRequestL())
            {               
            	UpdateListBoxL( currentFeatureId );
            }
            break;
        case EGSSettIdPinCode:            
            iSecurity->ChangePinL();
            break;
        case EGSSettIdPin2Code:
            iSecurity->ChangePin2L();
            break;
        case EGSSettIdAutolock:        
            SetAutolockTimeL( iSecurity->ChangeAutoLockPeriodL( 
                                         iModel->AutoLockPeriod() ) );
            break;
        case EGSSettIdSecurityCode:
            iSecurity->ChangeSecCodeL();
            break;
        case EGSSettIdSimChange:    
            if(iSecurity->ChangeSimSecurityL())
            {
            	UpdateListBoxL( currentFeatureId );
            }
            break; 
            
#ifdef RD_REMOTELOCK
        case EGSSettIdRemoteLock:
            SetRemoteLockStatusL( iModel->AutoLockPeriod() );
            break;
            
#endif                
        case EGSSettIdClosedUserGroup:
        	if(!FeatureManager::FeatureSupported( KFeatureIdFfNoCugSupport ))
    		{        
	            CugModeL();
	            UpdateListBoxL( currentFeatureId );
	          }
            break;
        case EGSSettIdSatOperations:
            SetSatOperationsL();
            break;
        default:
            break;
        }
    
    }

// ---------------------------------------------------------------------------
// CGSSimSecPlugin::SetAutolockTimeL()
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::SetAutolockTimeL( TInt aPeriod )
    { 
    iModel->SetAutoLockPeriod( aPeriod );
    UpdateListBoxL( EGSSettIdAutolock );
    }

// ---------------------------------------------------------------------------
// CGSSimSecPlugin::SetSatOperationsL()
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::SetSatOperationsL()
    {
    TInt i = iModel->SatOperations();
    
    if ( i == 0 )
        {
        iModel->SetSatOperations( 1 );
        }
    else
        {
        iModel->SetSatOperations( 0 );
        }
    UpdateListBoxL( EGSSettIdSatOperations );
    }

// ---------------------------------------------------------------------------
// CGSSimSecPlugin::SetSatOperationsL()
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::SetSatWithSettingPageL()
    {
    TInt currentItem = iModel->SatOperations();

    CDesCArrayFlat* items =  iCoeEnv->ReadDesC16ArrayResourceL( R_SAT_ARRAY );
    CleanupStack::PushL( items );

    CAknRadioButtonSettingPage* page = 
        new( ELeave ) CAknRadioButtonSettingPage( R_SAT_SETTING_PAGE, 
                                                  currentItem, items );

    if ( page->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )            
        {    
        iModel->SetSatOperations( currentItem );
        }
    
    CleanupStack::PopAndDestroy( items );

    UpdateListBoxL( EGSSettIdSatOperations );
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::CugModeL()
// 
// 
// ---------------------------------------------------------------------------
void CGSSimSecPlugin::CugModeL()
    {    
    TInt cugIndex = 0;
    TInt currentItem = 0;
    TInt cugMode = 0;
    TInt cugDefault;
    TInt err = KErrNone;

    err = iCugSettings.Get( ESSSettingsDefaultCug, cugDefault );
    User::LeaveIfError( err );

    
    if ( iCugSettings.Get( ESSSettingsCug, cugMode ) != KErrNone )
        {// getting mode was not succesful
        cugMode = cugDefault;
        }

    if ( cugMode == cugDefault )
        {
        currentItem = EGSCugNetworkDefault;
        if ( iCugSettings.PreviousCugValue( cugIndex ) != KErrNone )        
            {
            cugIndex = 0;
            }
        }
    else
        {
        switch ( cugMode )
            {
            case ESSSettingsCugSuppress:
                currentItem = EGSCugOff;
                if ( iCugSettings.PreviousCugValue( cugIndex ) != KErrNone )
                    {
                    cugIndex = 0;
                    }
                break;
            default:
                currentItem = EGSCugOn;
                cugIndex = cugMode;
                break;
            }
        }


    CDesCArrayFlat* items = iCoeEnv->ReadDesC16ArrayResourceL( R_CUG_LBX );
    CleanupStack::PushL( items );

    CAknRadioButtonSettingPage* page = 
        new( ELeave ) CAknRadioButtonSettingPage( R_CUG_SETTING_PAGE, 
                                                  currentItem, items );

    // call the appropriate cug- methods here
    if ( page->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )    
        {    
        
        switch ( currentItem )
            {
            case EGSCugNetworkDefault://cug mode set default, 
                User::LeaveIfError( iCugSettings.Set( ESSSettingsCug, 
                                                      cugDefault ) );
                break;
            case EGSCugOn: //1, index is queried, if query ok then
                // set the index and mode
                if ( CugIndexQueryL( cugIndex, cugDefault )  )
                    {
                    if ( iCugSettings.IsValueValidCugIndex( cugIndex ) )
                        {
                        User::LeaveIfError( iCugSettings.Set( ESSSettingsCug, 
                                                              cugIndex ) );
                        }
                    else
                        {
                        User::LeaveIfError( iCugSettings.Set( ESSSettingsCug, 
                                                              cugDefault ) );
                        User::LeaveIfError( iCugSettings.ResetPreviousCugValue() );
                        }
                    }
                break;
            case EGSCugOff://2, sets cug mode "inactive"
                User::LeaveIfError( iCugSettings.Set( ESSSettingsCug, 
                                    ESSSettingsCugSuppress ) );
                break;
            default:
                break;
            }
        }
    CleanupStack::PopAndDestroy( items );
    return;    
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::CugIndexQueryL()
// 
// 
// ---------------------------------------------------------------------------
TInt CGSSimSecPlugin::CugIndexQueryL( TInt& aCugIndex, TInt& aCugDefault )
    {    
    while ( ETrue )
        {
        CCugQuery* dlg = new( ELeave ) CCugQuery( aCugIndex,
                                       CAknQueryDialog::ENoTone );
    
        if ( dlg->ExecuteLD( R_CUG_INDEX ) )
            {
            // check content validity (?-32767), 
            // ui spec concerned only values above limit
            if( !iCugSettings.IsValueValidCugIndex( aCugIndex )
                && ( aCugIndex != KEmptyCugIndex )
                && ( aCugIndex != aCugDefault ) )
                {
                CAknNoteDialog* dlg = new ( ELeave ) 
                    CAknNoteDialog( CAknNoteDialog::EErrorTone, 
                                    CAknNoteDialog::ELongTimeout );
                dlg->ExecuteLD( R_CUG_INDEX_ERROR_NOTE );
                }
            else //index ok, break
                {
                break;
                }
            }
        else // query cancelled
            {
            return EFalse;
            }
        }

    return ETrue;    
    }


// ---------------------------------------------------------------------------
// CCugQuery::CCugQuery()
// 
// ---------------------------------------------------------------------------
//
CCugQuery::CCugQuery( TInt& aNumber, const TTone aTone )
    : CAknNumberQueryDialog( aNumber, aTone )
    {
    }


// ---------------------------------------------------------------------------
// CCugQuery::UpdateLeftSoftKeyL()
// Left softkey is allways visible
// ---------------------------------------------------------------------------
//
void CCugQuery::UpdateLeftSoftKeyL()
    {
    MakeLeftSoftkeyVisible( ETrue );
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::HandleResourceChangeL( TInt aType )
// Updates view layout
//  
// ---------------------------------------------------------------------------
//
void CGSSimSecPlugin::HandleResourceChangeL( TInt aType )
    {
    if( aType == KAknsMessageSkinChange ||
        aType == KEikDynamicLayoutVariantSwitch )
        {
        //iContainer->HandleResourceChangeL( aType );
        }
    }


// ---------------------------------------------------------------------------
// CGSSimSecPlugin::HandleNotifyPSL
//
// Handling PS keys change
// ---------------------------------------------------------------------------
//  
void CGSSimSecPlugin::HandleNotifyPSL( const TUid aUid, const TInt& aKey,
                                       const TRequestStatus& /* aStatus */ )
    {
    if ( aUid == KPSUidBluetoothSapConnectionState && 
         aKey == KBTSapConnectionState )
        {
        Visible();
        }
    }


// ========================= From CGSPluginInterface ==================

// ----------------------------------------------------------------------------
// CGSSimSecPlugin::GetCaption
// 
// Return application/view caption.
// ----------------------------------------------------------------------------
//
void CGSSimSecPlugin::GetCaptionL( TDes& aCaption ) const
    {
    // the resource file is already opened.
    HBufC* result = StringLoader::LoadL( R_GS_SIM_SECURITY_VIEW_CAPTION );
    
    aCaption.Copy( *result );
    delete result;
    }
    

// ----------------------------------------------------------------------------
// CGSSimSecPlugin::PluginProviderCategory
// 
// A means to identify the location of this plug-in in the framework.
// ----------------------------------------------------------------------------
//
TInt CGSSimSecPlugin::PluginProviderCategory() const
    {
    //To identify internal plug-ins.
    return KGSPluginProviderInternal;
    }
    

// ----------------------------------------------------------------------------
// CGSSimSecPlugin::Visible
// 
// Provides the visibility status of self to framework.
// ----------------------------------------------------------------------------
//    
TBool CGSSimSecPlugin::Visible() const
    {
    TInt btSapConnectionState;
    TBool visible = ETrue;

    iBtSapListener->Get( btSapConnectionState );

    if ( btSapConnectionState == EBTSapConnected )
        {
        visible = EFalse;
        }
    
    return visible;
    }



// ---------------------------------------------------------------------------
// CGSSimSecPlugin::SetRemoteLockStatusL()
// 
// 
// ---------------------------------------------------------------------------
TInt CGSSimSecPlugin::SetRemoteLockStatusL( TInt aAutoLockPeriod )
    {
    #ifdef RD_REMOTELOCK
    #ifdef _DEBUG
    RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - Enter" ) );
    #endif // DEBUG

    TInt retValue( KErrNone );
    TBool remoteLockStatus( EFalse );
    TBuf<KRLockMaxLockCodeLength> remoteLockCode;

    CRemoteLockSettings* remoteLockSettings = CRemoteLockSettings::NewLC();

    // Get the current remote lock status 
    if ( remoteLockSettings->GetEnabled( remoteLockStatus ) )
        {
        // Show remote lock setting page
        retValue = iSecurity->ChangeRemoteLockStatusL( remoteLockStatus, remoteLockCode, aAutoLockPeriod );

        if ( retValue == KErrNone )
            {
            if ( remoteLockStatus )
                {
                // Set remote lock status
                if ( remoteLockSettings->SetEnabledL( remoteLockCode ) )
                    {
                    // Remote lock status was set successfully
                    #ifdef _DEBUG
                    RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - Remote lock enabled and code set" ) );
                    #endif // DEBUG
                    }
                else
                    {
                    // Failed to enabled remote lock 
                    retValue = KErrGeneral;

                    #ifdef _DEBUG
                    RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - remoteLockSettings->SetEnabledL failed" ) );
                    #endif // DEBUG
                    }
                }
            else
                {
                // Disable remote lock
                if ( remoteLockSettings->SetDisabled() )
                    {
                    // Remote lock disabled
                    #ifdef _DEBUG
                    RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - Remote lock disabled" ) );
                    #endif // DEBUG
                    }
                else
                    {
                    // Failed to disable remote lock
                    retValue = KErrGeneral;

                    #ifdef _DEBUG
                    RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - remoteLockSettings->SetDisabled failed" ) );
                    #endif // DEBUG
                    }
                }
            }
        else
            {
            // User interaction (setting page) failed for some reason
            #ifdef _DEBUG
            RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - iSecurity->ChangeRemoteLockStatusL failed" ) );
            #endif // DEBUG
            }
        }
    else
        {
        // Failed to retreive the current remote lock status
        retValue = KErrGeneral;

        #ifdef _DEBUG
        RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - remoteLockSettings->GetEnabled failed" ) );
        #endif // DEBUG
        }

    CleanupStack::PopAndDestroy( remoteLockSettings );
    remoteLockSettings = NULL;

    UpdateListBoxL( EGSSettIdRemoteLock );

    #ifdef _DEBUG
    RDebug::Print( _L( "(GS)CGSSettListSimSecurityView::SetRemoteLockStatusL() - Exit" ) );
    #endif // DEBUG
	return retValue;
	#else //!RD_REMOTELOCK 
    return KErrNotSupported;
    #endif // RD_REMOTELOCK  
    }
    
    
// ----------------------------------------------------------------------------
// CGSSimSecPlugin::DynInitMenuPaneL()
// 
// Display the dynamic menu
// ----------------------------------------------------------------------------
void CGSSimSecPlugin::DynInitMenuPaneL( TInt aResourceId,
                                          CEikMenuPane* aMenuPane )
    {

	// show or hide the 'help' menu item when supported
    if( aResourceId == R_GS_SIM_SEC_MENU_ITEM_HELP )
        {
        User::LeaveIfNull( aMenuPane );    
        if ( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
            {
            aMenuPane->SetItemDimmed( EAknCmdHelp, EFalse );
            }
        else
            {
            aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
            }
        }

    } 
// End of File