appinstaller/AppMngr2/GSSettingsPlugin/src/appmngr2gssettingsplugin.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:22:02 +0100
branchRCL_3
changeset 66 8b7f4e561641
parent 65 7333d7932ef7
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2003-2010 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:   AppMngr2 Settings plug-in for GS (General Settings)
*
*/


#include "appmngr2gssettingsplugin.h"   // CAppMngrGSSettingsPlugin
#include "appmngr2gssettingscontainer.h" // CAppMngr2GSSettingsContainer
#include "appmngr2.hrh"                 // KAppMngr2AppUidValue
#include <gsprivatepluginproviderids.h> // KGSPluginProviderInternal
#include <appmngr2debugutils.h>         // FLOG macros
#include <appmngr2driveutils.h>         // TAppMngr2DriveUtils
#include <aknradiobuttonsettingpage.h>  // CAknRadioButtonSettingPage
#include <akntextsettingpage.h>         // CAknTextSettingPage
#include <SWInstallerInternalCRKeys.h>  // KCRUidSWInstallerSettings
#include <centralrepository.h>          // CRepository
#include <StringLoader.h>               // StringLoader
#include <akntitle.h>                   // CAknTitlePane
#include <aknnotewrappers.h>            // CAknInformationNote
#include <hlplch.h>                     // HlpLauncher
#include <featmgr.h>                    // FeatureManager
#include <csxhelp/am.hlp.hrh>           // Help IDs
#include <appmngr2gssettingspluginrsc.rsg> // Resource IDs
#include <appmngr2.mbg>                 // Bitmap IDs

_LIT( KAppMngr2GsSettingsPluginResourceFileName, "appmngr2gssettingspluginrsc.rsc" );  
_LIT( KAppMngr2IconFileNameMif, "appmngr2.mif" );
_LIT( KDriveZ, "z:" );

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

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

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::~CAppMngr2GSSettingsPlugin()
// ---------------------------------------------------------------------------
//
CAppMngr2GSSettingsPlugin::~CAppMngr2GSSettingsPlugin()
    {
    if( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = NULL;
        }
    iResources.Close();
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::GetCaptionL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::GetCaptionL( TDes& aCaption ) const
    {
    // the resource file is already opened.
    HBufC* result = StringLoader::LoadL( R_SET_FOLDER_APPLICATION_MANAGER );
    aCaption.Copy( *result );
    delete result;
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::CreateIconL()
// ---------------------------------------------------------------------------
//
CGulIcon* CAppMngr2GSSettingsPlugin::CreateIconL( const TUid aIconType )
    {
    HBufC* iconFilePath = HBufC::NewLC( KDriveZ().Length() +
            KDC_APP_BITMAP_DIR().Length() + KAppMngr2IconFileNameMif().Length() );
    TPtr ptr = iconFilePath->Des();
    ptr.Append( KDriveZ );
    ptr.Append( KDC_APP_BITMAP_DIR );
    ptr.Append( KAppMngr2IconFileNameMif );

    CGulIcon* icon;
    TInt iconId = EMbmAppmngr2Qgn_prop_cp_inst_settings;
    TInt maskId = EMbmAppmngr2Qgn_prop_cp_inst_settings_mask;
    if( aIconType == KGSIconTypeLbxItem )
        {
        icon = AknsUtils::CreateGulIconL( AknsUtils::SkinInstance(),
                KAknsIIDQgnPropCpInstSettings, *iconFilePath,
                iconId, maskId );
        }
    else
        {
        icon = CGSPluginInterface::CreateIconL( aIconType );
        }

    CleanupStack::PopAndDestroy( iconFilePath );
    return icon;
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::PluginProviderCategory()
// ---------------------------------------------------------------------------
//
TInt CAppMngr2GSSettingsPlugin::PluginProviderCategory() const
    {
    return KGSPluginProviderInternal;
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::Id()
// ---------------------------------------------------------------------------
//
TUid CAppMngr2GSSettingsPlugin::Id() const
    {
    return KAppMngr2GSSettingsUid;
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::HandleCommandL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::HandleCommandL( TInt aCommand )
    {
    switch ( aCommand )
        {
        case EAppMngr2CmdChange:
        case EAknSoftkeyChange:
            {
            HandleListBoxSelectionL();
            break;
            }
        case EAknSoftkeyBack:
            {
            AppUi()->ActivateLocalViewL( iPrevViewId.iViewUid );
            break;
            }
        case EAknSoftkeyExit:
            {
            static_cast<MEikCommandObserver*>( AppUi() )->ProcessCommandL( EAknCmdExit );
            break;
            }
        case EAknCmdHelp:
        case EEikCmdHelpContents:
            {
            if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
                {
                CArrayFix<TCoeHelpContext>* contexts =
                    new( ELeave ) CArrayFixFlat<TCoeHelpContext>( 1 );
                CleanupStack::PushL( contexts );
                TCoeHelpContext context;
                context.iMajor = KAppMngr2AppUid;
                context.iContext = KAM_HLP_GENERAL_SETTINGS;
                contexts->AppendL( context );
                CleanupStack::Pop( contexts );
                HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), contexts );
                }
            break;
            }
        default:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::HandleViewRectChange()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::HandleViewRectChange()
    {
    if( iContainer )
        {
        iContainer->SetRect( ClientRect() );
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::DynInitMenuPaneL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::DynInitMenuPaneL( TInt aResourceId, CEikMenuPane* aMenuPane )
    {
    switch( aResourceId )
        {
        case R_APPMNGR2_SETTINGS_MENU:
            if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
                {
                aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
                }
            break;
        default:
            break;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::HandleListBoxEventL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::HandleListBoxEventL( CEikListBox* /*aListBox*/,
        TListBoxEvent aEventType )
    {
    switch ( aEventType )
        {
        case EEventEnterKeyPressed:
        case EEventItemSingleClicked:
            HandleListBoxSelectionL();
            break;
        default:
           break;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::DoActivateL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::DoActivateL( const TVwsViewId& aPrevViewId,
        TUid /*aCustomMessageId*/, const TDesC8& /*aCustomMessage*/ )
    {
    iPrevViewId = aPrevViewId;
    if( iContainer )
        {
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = NULL;
        }
    HBufC* jamSetTitle = StringLoader::LoadLC( R_AM_INSTALLATION_SETTINGS_TITLE );
    CEikStatusPane* statusPane = StatusPane();
    CAknTitlePane* titlePane;
    titlePane = ( CAknTitlePane* ) statusPane->ControlL( TUid::Uid( EEikStatusPaneUidTitle ) );
    titlePane->SetTextL( jamSetTitle->Des() );
    CleanupStack::PopAndDestroy( jamSetTitle );
    jamSetTitle = NULL;

    iContainer = CAppMngr2GSSettingsContainer::NewL( ClientRect() );
    iContainer->SetMopParent( this );
    iContainer->MakeVisible( ETrue );
    iContainer->SetRect( ClientRect() );
    iContainer->ActivateL();
    AppUi()->AddToStackL( *this, iContainer );
    iContainer->ListBox()->SetListBoxObserver( this );
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::DoDeactivate()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::DoDeactivate()
    {
    if( iContainer )
        {
        iContainer->MakeVisible( EFalse );
        AppUi()->RemoveFromViewStack( *this, iContainer );
        delete iContainer;
        iContainer = NULL;
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::HandleForegroundEventL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::HandleForegroundEventL( TBool aForeground )
    {
    if( aForeground )
        {
        iContainer->UpdateListBoxContentL();
        }
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::CAppMngr2GSSettingsPlugin()
// ---------------------------------------------------------------------------
//
CAppMngr2GSSettingsPlugin::CAppMngr2GSSettingsPlugin() : iResources( *CCoeEnv::Static() )
    {
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::ConstructL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::ConstructL()
    {
    TFileName* fileName = TAppMngr2DriveUtils::NearestResourceFileLC(
            KAppMngr2GsSettingsPluginResourceFileName, iCoeEnv->FsSession() );
    
    iResources.OpenL( *fileName );
    BaseConstructL( R_APPMNGR2_SETTINGS_VIEW );

    CleanupStack::PopAndDestroy( fileName );
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::HandleListBoxSelectionL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::HandleListBoxSelectionL()
    {
    TInt currentIndex = iContainer->ListBox()->CurrentItemIndex();
    ShowSettingPageL( currentIndex );
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::ShowSettingPageL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::ShowSettingPageL( TInt aSettingIndex )
    {
    FLOG( "CAppMngr2GSSettingsPlugin: ShowSettingPageL( %d )", aSettingIndex );

    // Variation flag may be used to hide "allow untrusted" option 
    TInt hideAllowUntrusted = 1;
    CRepository* variationDB = CRepository::NewLC( KCRUidSWInstallerLV );
    variationDB->Get( KSWInstallerHideUntrustedIns, hideAllowUntrusted );
    CleanupStack::PopAndDestroy( variationDB );
    if( hideAllowUntrusted )
        {
        // Increase the setting index so that allow untrusted is not taken into account
        aSettingIndex++;
        }

    if( aSettingIndex == EAppMngr2SettingOcsp || aSettingIndex == EAppMngr2SettingOcspUrl )
        {
        if( !FeatureManager::FeatureSupported( KFeatureIdOCSP ) )
            {
            // If OCSP feature is not supported, it's not allowed to change values
            HBufC* p = StringLoader::LoadLC( R_AM_NOTE_LOCKED_SETTIGS );
            CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );
            note->ExecuteLD( p->Des() );
            CleanupStack::PopAndDestroy( p );
            return;
            }
        }

    HBufC* urlTextStr = HBufC::NewLC( NCentralRepositoryConstants::KMaxUnicodeStringLength );
    TPtr urlText( urlTextStr->Des() );
    urlText.Zero();
    TInt newIndex = 0;

    if( aSettingIndex == EAppMngr2SettingSwInstall || aSettingIndex == EAppMngr2SettingOcsp )
        {
        CRepository* repDB = CRepository::NewLC( KCRUidSWInstallerSettings );
        CAknSettingPage* dlg = NULL;
        CDesCArrayFlat* itemArray = NULL;

        if( aSettingIndex == EAppMngr2SettingSwInstall )
            {
            // Install software - toggle 'Signed only' and 'All'
            TBool allowUntrusted = EFalse;
            repDB->Get( KSWInstallerAllowUntrusted, allowUntrusted );
            allowUntrusted = !allowUntrusted;
            SetPermissionL( aSettingIndex, allowUntrusted, urlText );
            }
        else
            {
            // OCSP check
            repDB->Get( KSWInstallerOcspProcedure, newIndex );
            newIndex = MapOCSPIndex( newIndex );
            itemArray = iCoeEnv->ReadDesC16ArrayResourceL(
                    R_APPMNGR2_OCSP_CHECK_VALUE_ARRAY );
            dlg = new ( ELeave ) CAknRadioButtonSettingPage(
                    R_APPMNGR2_OCSP_CHECK_PAGE, newIndex, itemArray );
            }
        CleanupStack::PopAndDestroy( repDB );
        CleanupStack::PushL( itemArray );

        if( dlg && dlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
            {
            SetPermissionL( aSettingIndex, newIndex, urlText );
            }
        CleanupStack::PopAndDestroy( itemArray );
        }
    else if( aSettingIndex == EAppMngr2SettingOcspUrl )
        {
        CRepository* repDB = CRepository::NewLC( KCRUidSWInstallerSettings );
        repDB->Get( KSWInstallerOcspDefaultURL, urlText );
        CAknTextSettingPage* textDlg = new ( ELeave ) CAknTextSettingPage(
                R_APPMNGR2_OCSP_URL_SETTING_PAGE, urlText,
                CAknTextSettingPage::EZeroLengthAllowed );
        CleanupStack::PushL( textDlg );
        textDlg->ConstructL();
        textDlg->TextControl()->SetTextLimit( KAppMngr2MaxOcspUrlLength );

        CleanupStack::Pop( textDlg );
        CleanupStack::PopAndDestroy( repDB );

        if( textDlg->ExecuteLD( CAknSettingPage::EUpdateWhenChanged ) )
            {
            // Remove spaces from URL text
            for( TInt pos = urlText.Length() - 1; pos >= 0; --pos ) {
                if( TChar( urlText[pos] ).IsSpace() ) {
                    urlText.Delete( pos, 1 );
                }
            }
            SetPermissionL( aSettingIndex, newIndex, urlText );
            }
        }
    else
        {
        ASSERT( EFalse );
        }
    
    CleanupStack::PopAndDestroy( urlTextStr );
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::SetPermissionL()
// ---------------------------------------------------------------------------
//
void CAppMngr2GSSettingsPlugin::SetPermissionL( TInt aSettingIndex,
                                       TInt aNewValueIndex,
                                       TPtrC16 aUrlText )
    {
    FLOG( "CAppMngr2GSSettingsPlugin::SetPermissionL( %d, %d, %S )",
            aSettingIndex, aNewValueIndex, &aUrlText );

    // Write the setting value to Central repository
    CRepository* repDB = CRepository::NewLC( KCRUidSWInstallerSettings );
    switch( aSettingIndex )
        {
        case EAppMngr2SettingSwInstall:
            repDB->Set( KSWInstallerAllowUntrusted, aNewValueIndex );
            break;
        case EAppMngr2SettingOcsp:
            aNewValueIndex = MapOCSPIndex( aNewValueIndex );
            repDB->Set( KSWInstallerOcspProcedure, aNewValueIndex );
            break;
        case EAppMngr2SettingOcspUrl:
            repDB->Set( KSWInstallerOcspDefaultURL, aUrlText );
            break;
        default:
            ASSERT( EFalse );
            break;
        }
    CleanupStack::PopAndDestroy( repDB );

    iContainer->UpdateListBoxContentL();
    }

// ---------------------------------------------------------------------------
// CAppMngr2GSSettingsPlugin::MapOCSPIndex()
// ---------------------------------------------------------------------------
//
TInt CAppMngr2GSSettingsPlugin::MapOCSPIndex( TInt aValue )
    {
    TInt result = 0;

    switch( aValue )
        {
        case ESWInstallerOcspProcedureOff:
            result = EAppMngr2OcspCheckValueArrayOff;
            break;
        case ESWInstallerOcspProcedureOn:
            result = EAppMngr2OcspCheckValueArrayOn;
            break;
        case ESWInstallerOcspProcedureMust:
            result = EAppMngr2OcspCheckValueArrayMustPass;
            break;
        default:
            break;
        }

    return result;
    }