pkiutilities/CertmanUi/SRC/CertmanuiviewTrust.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 16:04:40 +0300
branchRCL_3
changeset 21 09b1ac925e3f
parent 9 a005fc61b02a
child 22 03674e5abf46
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2003-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:   Implementation of class CCertManUIViewTrust
*                Updates Options list depending on the status of the
*                trusted clients (unavailable, located in WIM).
*                Handles Softkey and Options list commands.
*
*/


// INCLUDE FILES
#include <certificateapps.h>
#include <certmanui.rsg>
#include "CertmanuiKeeper.h"
#include "CertmanuiviewTrust.h"
#include "CertmanuicontainerTrust.h"
#include "CertmanuicontainerAuthority.h"
#include "CertmanuiSyncWrapper.h"
#include "Certmanuitrustids.h"
#include "Certmanui.hrh"
#include "CertmanuiCommon.h"
#include "CertManUILogger.h"
#include "securityuisvariant.hrh"
#include "CertmanuiCertificateHelper.h"

#include    <hlplch.h>            // For HlpLauncher
#include    <featmgr.h>           // For FeatureManager



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

// ---------------------------------------------------------
// CCertManUIViewTrust::CCertManUIViewTrust(CCertManUIKeeper& aKeeper)
// Constructor
// ---------------------------------------------------------
//
CCertManUIViewTrust::CCertManUIViewTrust( CCertManUIKeeper& aKeeper )
    : iKeeper( aKeeper )
    {
    CERTMANUILOGGER_WRITE_TIMESTAMP(
        "CCertManUIViewTrust::CCertManUIViewTrust" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::~CCertManUIViewTrust()
// Destructor
// ---------------------------------------------------------
//
CCertManUIViewTrust::~CCertManUIViewTrust()
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::~CCertManUIViewTrust" );

    if ( iContainerTrust )
        {
        AppUi()->RemoveFromViewStack( *this, iContainerTrust );
        delete iContainerTrust;
        }

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::~CCertManUIViewTrust" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust* CCertManUIViewTrust::NewL(const TRect& /*aRect*/,
//      CCertManUIKeeper& aKeeper)
// ---------------------------------------------------------
//
CCertManUIViewTrust* CCertManUIViewTrust::NewL(
    const TRect& /*aRect*/, CCertManUIKeeper& aKeeper )
    {
    CCertManUIViewTrust* self = new (ELeave) CCertManUIViewTrust( aKeeper );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// ---------------------------------------------------------
// CCertManUIViewTrust* CCertManUIViewTrust::NewLC(const TRect& /*aRect*/,
//      CCertManUIKeeper& aKeeper)
// ---------------------------------------------------------
//
CCertManUIViewTrust* CCertManUIViewTrust::NewLC(const TRect& /*aRect*/,
    CCertManUIKeeper& aKeeper)
    {
    CCertManUIViewTrust* self = new (ELeave) CCertManUIViewTrust(aKeeper);
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::ConstructL()
// EPOC two-phased constructor
// ---------------------------------------------------------
//
void CCertManUIViewTrust::ConstructL()
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::ConstructL" );

    BaseConstructL( R_CERTMANUI_VIEW_TRUST );

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::ConstructL" );
  }

// ---------------------------------------------------------
// CCertManUIViewTrust::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
// Updates Options list with correct items depending on
// whether the listbox is empty or if the trust can be changed
// Change trust is not shown if certificate location is not supported
// unsupported certificate locations are ECrCertLocationWIMCard,
//                    ECrCertLocationWIMURL,
//                    ECrCertLocationPhoneMemory,
//                    ECrCertLocationPhoneMemoryURL
// Change trust is not shown if certificate format is not supported
// unsupported certificate formats are ECrX968Certificate
//                    ECrCertificateURL
// ---------------------------------------------------------
//
void CCertManUIViewTrust::DynInitMenuPaneL(
    TInt aResourceId, CEikMenuPane* aMenuPane )
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::DynInitMenuPaneL" );

    if ( aResourceId == R_CERTMANUI_VIEW_TRUST_MENU )
        {
        if( !FeatureManager::FeatureSupported( KFeatureIdHelp ) )
             {
             aMenuPane->DeleteMenuItem( EAknCmdHelp );
             }

        TInt currentItemTrust = iContainerTrust->iListBox->CurrentItemIndex();
        if ( currentItemTrust == -1 )
            {
            aMenuPane->SetItemDimmed( ECertManUICmdAppChangeTrust, ETrue );
            }

        CCertManUIViewAuthority* authorityView = STATIC_CAST(
            CCertManUIViewAuthority*, AppUi()->View( KCertManUIViewAuthorityId ) );
        TInt currentItem = authorityView->
            iContainerAuthority->iListBox->CurrentItemIndex();
        CCTCertInfo& entry = *( iKeeper.iCALabelEntries[ currentItem ]->iCAEntry );

        if ( !iKeeper.iCertificateHelper->IsOneMarkedCertificateDeletable(
                authorityView->iContainerAuthority->iListBox, KCertTypeAuthority ) )
                {
                LOG_WRITE( "Read only Certificate" );
                aMenuPane->SetItemDimmed( ECertManUICmdAppChangeTrust, ETrue );
                }

        if ( currentItem >= 0 )
            {
            if( KCertManUIViewTrustApplicationControllerId ==
                iContainerTrust->iClientUids[ currentItemTrust ] &&
                iKeeper.IsLocalFeatureSupported( KSecurityUIsNoNativeAppTrustSettingChange ) )
                {
                aMenuPane->SetItemDimmed( ECertManUICmdAppChangeTrust, ETrue );
                }
            }
        }

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::DynInitMenuPaneL" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::Id() const
// Returns Trust view id
// ---------------------------------------------------------
//
TUid CCertManUIViewTrust::Id() const
    {
    return KCertManUIViewTrustId;
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::HandleCommandL(TInt aCommand)
// Handles Softkey and Options list commands
// ---------------------------------------------------------
//
void CCertManUIViewTrust::HandleCommandL( TInt aCommand )
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::HandleCommandL" );

    if ( iKeeper.iWrapper->IsActive() )
        {
        return;
        }

    switch ( aCommand )
        {
        case EAknSoftkeyBack:
            {
            AppUi()->ActivateLocalViewL( KCertManUIViewAuthorityId );
            break;
            }
        // put the view specific menu commands here
        case EAknCmdExit:
            {
            ((CAknViewAppUi*)iAvkonAppUi)->HandleCommandL( EAknCmdExit );
            break;
            }
        case ECertManUICmdAppChangeTrust:
            {
            PopupTrustChangeSettingPageL();
            break;
            }

        case EAknCmdHelp:
            {
            if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
                {
                HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(),
                    AppUi()->AppHelpContextL() );
                }
            break;
            }

        default:
            {
            AppUi()->HandleCommandL( aCommand );
            break;
            }
        }

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::HandleCommandL" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::HandleClientRectChange()
// ---------------------------------------------------------
//
void CCertManUIViewTrust::HandleClientRectChange()
    {
    if ( iContainerTrust )
        {
        iContainerTrust->SetRect( ClientRect() );
        }
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::DoActivateL(
//      const TVwsViewId& /*aPrevViewId*/,
//      TUid aCustomMessageId, const TDesC8& /*aCustomMessage*/)
// Updates the view when opening it
// ---------------------------------------------------------
//
void CCertManUIViewTrust::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
    TUid aCustomMessageId, const TDesC8& /*aCustomMessage*/ )
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::DoActivateL" );

    if ( iContainerTrust )
        {
        ((CAknViewAppUi*)iAvkonAppUi)->RemoveFromViewStack(
            *this, iContainerTrust );
        delete iContainerTrust;
        iContainerTrust = NULL;
        }

    TInt trustViewItem = STATIC_CAST( TInt, aCustomMessageId.iUid );
    iContainerTrust = new(ELeave) CCertManUIContainerTrust( *this, iKeeper );
    // to fix problem of focus if trust view has more than one item
    TInt currentPosition = 0;
    TInt topItem = 0;
    iContainerTrust->SetMopParent( this );
    iContainerTrust->ConstructL( ClientRect());

    UpdateMenuBar();

    UpdateNaviPaneL();

    iContainerTrust->DrawListBoxL( currentPosition, topItem, trustViewItem );
    ((CAknViewAppUi*)iAvkonAppUi)->AddToStackL( *this, iContainerTrust );

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::DoActivateL" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::DoDeactivate()
// ---------------------------------------------------------
//
void CCertManUIViewTrust::DoDeactivate()
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::DoDeactivate" );

    if ( iContainerTrust )
        {
        ((CAknViewAppUi*)iAvkonAppUi)->RemoveFromViewStack( *this, iContainerTrust );
        delete iContainerTrust;
        iContainerTrust = NULL;
        }

    RemoveNaviPane();

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::DoDeactivate" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::Container()
// Returns iContainerTrust
// ---------------------------------------------------------
//
CCoeControl* CCertManUIViewTrust::Container()
    {
    return iContainerTrust;
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::ChangeTrustL()
// Calls Change trust method UpdateTrustSettingsViewL in certmanuicontainertrust
// for not supported certificate formats ECrX968Certificate and ECrCertificateURL
// and for not supported certificate locations  ECrCertLocationWIMCard, ECrCertLocationWIMURL,
// ECrCertLocationPhoneMemory, ECrCertLocationPhoneMemoryURL UpdateTrustSettingsViewL is not called
// also UpdateTrustSettingsViewL is not called if there are no clients in Trust view.
// This function is called when user presses joystick key in trusters list.
// ---------------------------------------------------------
//
void CCertManUIViewTrust::ChangeTrustL()
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::ChangeTrustL" );
    CCertManUIViewAuthority* authorityView = STATIC_CAST(
            CCertManUIViewAuthority*, AppUi()->View(KCertManUIViewAuthorityId) );
    // Policy decision: Trusters of read-only certs cannot be changed
    if ( iKeeper.iCertificateHelper->IsOneMarkedCertificateDeletable(
                authorityView->iContainerAuthority->iListBox, KCertTypeAuthority ) )

        {
        TInt currentItem = authorityView->
            iContainerAuthority->iListBox->CurrentItemIndex();

        CCTCertInfo& entry = *( iKeeper.iCALabelEntries[ currentItem ]->iCAEntry );

        TInt currentTruster = iContainerTrust->iListBox->CurrentItemIndex();

        if ( currentItem >= 0 )
            {
            TUid uid = iContainerTrust->iClientUids[ currentTruster ];

            iContainerTrust->ChangeTrustValueL( entry, uid );
            iContainerTrust->UpdateTrustListboxItemL( entry, currentTruster );
            }
        }

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::ChangeTrustL" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::PopupTrustChangeSettingPageL()
// ---------------------------------------------------------
//
void CCertManUIViewTrust::PopupTrustChangeSettingPageL()
    {
    CCertManUIViewAuthority* authorityView =
    STATIC_CAST( CCertManUIViewAuthority*,
            AppUi()->View( KCertManUIViewAuthorityId ) );
    TInt helpIndex3 = authorityView->
            iContainerAuthority->iListBox->CurrentItemIndex();
    iContainerTrust->PopupTrustChangeSettingPageL( helpIndex3 );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::UpdateMenuBar()
// Updates the menu bar
// ---------------------------------------------------------
//
void CCertManUIViewTrust::UpdateMenuBar()
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::UpdateMenuBar" );

    CCertManUIViewAuthority* authorityView = STATIC_CAST(
            CCertManUIViewAuthority*, AppUi()->View(KCertManUIViewAuthorityId) );

    CEikButtonGroupContainer*  cba = Cba();

    if (( cba == NULL ) || ( authorityView == NULL ))
        {
        return;
        }

    if ( !iKeeper.iCertificateHelper->IsOneMarkedCertificateDeletable(
                authorityView->iContainerAuthority->iListBox, ETrue ))
        {
        // Read-only certificate
        cba->MakeCommandVisible( ECertManUICmdAppChangeTrust, EFalse );
        }
    else
       {
       cba->MakeCommandVisible( ECertManUICmdAppChangeTrust, ETrue );
       }

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::UpdateMenuBar" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::UpdateNaviPaneL()
// Updates navi pane
// ---------------------------------------------------------
//
void CCertManUIViewTrust::UpdateNaviPaneL()
    {
    CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::UpdateNaviPaneL" );

    CEikStatusPane* sp = STATIC_CAST(
        CAknAppUi*, iEikonEnv->EikAppUi())->StatusPane();

    iNaviPane = STATIC_CAST(CAknNavigationControlContainer*,
        sp->ControlL(TUid::Uid(EEikStatusPaneUidNavi)));

    TResourceReader reader;
    iCoeEnv->CreateResourceReaderLC( reader, R_CM_NAVI_PANE_TRUST_SETTINGS );
    iTrustSettingsNaviPane = iNaviPane->CreateMessageLabelL( reader );
    CleanupStack::PopAndDestroy();  // reader

    iNaviPane->PushL( *iTrustSettingsNaviPane );

    CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::UpdateNaviPaneL" );
    }

// ---------------------------------------------------------
// CCertManUIViewTrust::RemoveNaviPane()
// Removes navi pane
// ---------------------------------------------------------
//
void CCertManUIViewTrust::RemoveNaviPane()
  {
  CERTMANUILOGGER_ENTERFN( " CCertManUIViewTrust::RemoveNaviPane" );

  if ( iNaviPane )
    {
    iNaviPane->Pop( iTrustSettingsNaviPane );
    }

  delete iTrustSettingsNaviPane;
  iTrustSettingsNaviPane = NULL;

  CERTMANUILOGGER_LEAVEFN( " CCertManUIViewTrust::RemoveNaviPane" );
  }


// End of File