appinstaller/AppinstUi/Plugin/CommonUI/Src/CUIDetailsDialog.cpp
changeset 0 ba25891c3a9e
child 13 0817e13c927e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/appinstaller/AppinstUi/Plugin/CommonUI/Src/CUIDetailsDialog.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,560 @@
+/*
+* Copyright (c) 2002-2008 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:   This file contains the implementation of CSisxUIInstall
+*                class member functions.
+*
+*/
+
+
+// INCLUDE FILES
+#include <aknmessagequerydialog.h>
+#include <aknlistquerydialog.h> // remove
+#include <StringLoader.h>
+#include <bautils.h>
+#include <eikenv.h>
+#include <data_caging_path_literals.hrh>
+#include <SWInstCommonUI.rsg>
+#include <pathinfo.h>
+#include <avkon.rsg>
+#include <DRMHelper.h>
+
+#include "CUIDetailsDialog.h"
+#include "CUICertificateDetailsDialog.h"
+#include "CUIUtils.h"
+
+using namespace SwiUI::CommonUI;
+
+// LOCAL CONSTANTS AND MACROS
+
+_LIT( KNextLine, "\n" );
+_LIT( KLinkTagOpen, "<AknMessageQuery Link>" );
+_LIT( KLinkTagClose, "</AknMessageQuery Link>" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::CCUIDetailsDialog
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCUIDetailsDialog::CCUIDetailsDialog()
+    : iCbaResourceId( R_AVKON_SOFTKEYS_OK_EMPTY )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::CCUIDetailsDialog
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCUIDetailsDialog::CCUIDetailsDialog( TInt aCbaResourceId )
+    : iCbaResourceId( aCbaResourceId )
+    {
+    }
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::CCUIDetailsDialog
+// C++ default constructor can NOT contain any code, that might leave.
+// -----------------------------------------------------------------------------
+//
+CCUIDetailsDialog::CCUIDetailsDialog( TInt aCbaResourceId, TCUIDetailsHeader aHeaderType )
+    : iCbaResourceId( aCbaResourceId ), iHeaderType( aHeaderType )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::ConstructL()
+    {    
+    iCoeEnv = CEikonEnv::Static();    
+    if ( !iCoeEnv )
+        {
+        User::Leave( KErrGeneral );        
+        }
+
+    TFileName fileName;
+    fileName.Append( KDC_RESOURCE_FILES_DIR );
+    fileName.Append( KCUIResourceFileName );
+    iResourceFileOffset = CUIUtils::LoadResourceFileL( fileName, iCoeEnv );    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUICertificateDetailsDialog::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCUIDetailsDialog* CCUIDetailsDialog::NewL()
+    {
+    CCUIDetailsDialog* self = new ( ELeave ) CCUIDetailsDialog();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCUICertificateDetailsDialog::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCUIDetailsDialog* CCUIDetailsDialog::NewL( TInt aCbaResourceId )
+    {
+    CCUIDetailsDialog* self = new ( ELeave ) CCUIDetailsDialog( aCbaResourceId );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CCUICertificateDetailsDialog::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCUIDetailsDialog* CCUIDetailsDialog::NewL( TInt aCbaResourceId,
+                                                     TBool aWithInstallHeader )
+    {
+    CCUIDetailsDialog* self = new ( ELeave ) CCUIDetailsDialog( aCbaResourceId,
+                                ( aWithInstallHeader ? EInstallHeader : EDetailsHeader ) );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CCUICertificateDetailsDialog::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CCUIDetailsDialog* CCUIDetailsDialog::NewL( TInt aCbaResourceId,
+                                                     TCUIDetailsHeader aHeaderType )
+    {
+    CCUIDetailsDialog* self = new ( ELeave ) CCUIDetailsDialog( aCbaResourceId,
+                                                                aHeaderType  );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// Destructor
+EXPORT_C CCUIDetailsDialog::~CCUIDetailsDialog()
+    {
+    delete iMessageArray;    
+   
+    if( iResourceFileOffset )
+        {
+        iCoeEnv->DeleteResourceFile( iResourceFileOffset );
+        }
+
+    iCommonCertificates.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ExecuteLD
+// Displays the dialog.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCUIDetailsDialog::ExecuteLD( MCUIInfoIterator& aIterator )
+    {
+    return ShowDialogL( aIterator );
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ExecuteLD
+// Displays the dialog with given certificates.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCUIDetailsDialog::ExecuteLD( MCUIInfoIterator& aIterator,
+                                            const RPointerArray<CCUICertificateInfo>& aCertInfos )
+    {
+    // Copy the certificates
+    for ( TInt index = 0; index < aCertInfos.Count(); index++ )
+        {
+        iCommonCertificates.Append( aCertInfos[index] );        
+        }
+
+    return ShowDialogL( aIterator );    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ExecuteLD
+// Displays the dialog with given certificates.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCUIDetailsDialog::ExecuteLD( MCUIInfoIterator& aIterator,
+                                            RFile& aFile )
+    {
+    iFile = aFile;
+    iFileSet = ETrue;
+
+    return ShowDialogL( aIterator );
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ExecuteLD
+// Displays the dialog with given certificates.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CCUIDetailsDialog::ExecuteLD( MCUIInfoIterator& aIterator,
+                                            const RPointerArray<CCUICertificateInfo>& aCertInfos,
+                                            RFile& aFile )
+    {
+    iFile = aFile;
+    iFileSet = ETrue;
+
+    return ExecuteLD( aIterator, aCertInfos );    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ShowDialogL
+// Helper to show the details dialog.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCUIDetailsDialog::ShowDialogL( MCUIInfoIterator& aIterator )
+    {
+    TInt result( 0 );
+
+    CleanupStack::PushL( this );
+
+    PopulateArrayL( aIterator );
+    HBufC* message = GetMessageDescriptorLC();        
+    
+    // Create and show the message query dialog
+    TCallBack certCallback( ShowCertificates, this );    
+    TCallBack drmCallback( ShowDrm, this );
+    
+    CAknMessageQueryDialog* dlg = CAknMessageQueryDialog::NewL( *message );
+    dlg->PrepareLC( R_SWCOMMON_DETAILS_DIALOG );
+#ifdef RD_COMBINE_INSTALLATION_QUERIES
+    HBufC* header = NULL;
+    switch( iHeaderType )
+        {
+        case EInstallAndDownloadHeader:
+            header = StringLoader::LoadLC( R_SWCOMMON_HEADER_DOWNLOAD );
+            dlg->QueryHeading()->SetTextL( *header );
+            CleanupStack::PopAndDestroy( header );
+            break;
+            
+        case EInstallHeader:
+            header = StringLoader::LoadLC( R_SWCOMMON_HEADER_INSTALL );
+            dlg->QueryHeading()->SetTextL( *header );
+            CleanupStack::PopAndDestroy( header );
+            break;
+            
+        case EDetailsHeader:
+        default:
+            break;
+        }
+#endif //RD_COMBINE_INSTALLATION_QUERIES
+    dlg->ButtonGroupContainer().SetCommandSetL( iCbaResourceId );
+    
+    if ( iCommonCertificates.Count() > 0 )
+        {
+        dlg->SetLink( certCallback );
+        }
+    if ( iFileSet )
+        {        
+        dlg->SetLink( drmCallback );
+        }    
+    
+    result = dlg->RunLD();
+    CleanupStack::PopAndDestroy( 2 ); // message, this
+
+    return result;    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::SetFieldL
+// Sets a field in the details dialog.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::SetFieldL( CDesCArray& aItemArray,
+                                   const TDesC& aHeading, 
+                                   const TDesC& aValue )
+    {
+    HBufC* temp = HBufC::NewLC( aHeading.Length() + aValue.Length() + 3 );
+    TPtr ptr( temp->Des() );
+    
+    if ( aItemArray.Count() > 0 )
+        {
+        ptr += KNextLine;
+        ptr += KNextLine;        
+        }
+    
+    ptr += aHeading;        
+    ptr += KNextLine;
+    if ( aValue.Length() > 0 )
+        {
+        ptr += aValue;
+        }    
+    aItemArray.AppendL( *temp );    
+    CleanupStack::PopAndDestroy( temp );    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::PopulateArrayL
+// Helper to populate the field array.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::PopulateArrayL( MCUIInfoIterator& aIterator )
+    {
+    delete iMessageArray;    
+    iMessageArray = NULL;    
+    iMessageArray = new (ELeave) CDesCArrayFlat( 8 );
+
+    // Construct the text to be shown
+    aIterator.Reset();    
+    while ( aIterator.HasNext() )
+        {
+        TPtrC heading;
+        TPtrC value;
+        
+        aIterator.Next( heading, value );
+        SetFieldL( *iMessageArray, heading, value );        
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::GetMessageDescriptorLC
+// Helper to get descriptor containing the fields of the dialog.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC* CCUIDetailsDialog::GetMessageDescriptorLC()
+    {
+    TInt size( 0 ); 
+    TInt index( 0 );
+
+    HBufC* type = StringLoader::LoadLC( R_SWCOMMON_DETAIL_TYPE );    
+    HBufC* typeString = HBufC::NewLC( type->Length() + 1);
+    typeString->Des().Copy( *type );
+    typeString->Des().Append( KNextLine() );    
+
+    HBufC* message = HBufC::NewLC( size );    
+    
+    for ( index = 0; index < iMessageArray->Count(); index++ )
+        {       
+        HBufC* tmp = message;
+        message = message->ReAllocL( tmp->Length() + (*iMessageArray)[index].Length() );
+        CleanupStack::Pop( tmp );
+        CleanupStack::PushL( message );
+        
+        message->Des().Append( (*iMessageArray)[index] );
+        // If this is the type field we need to add possible certificates and
+        // drm details
+        if ( (*iMessageArray)[index].Find( *typeString ) == 2 )
+            {
+            if ( iCommonCertificates.Count() > 0 )
+                {
+                AddCertificatesLC( message );                
+                }            
+            if ( iFileSet )
+                {
+                AddDrmLC( message );                
+                }            
+            }        
+        }    
+
+    CleanupStack::Pop( message );
+    CleanupStack::PopAndDestroy( 2, type );
+    CleanupStack::PushL( message );    
+
+    return message;    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::AddCertificatesLC
+// Helper to add certificate information to query text.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::AddCertificatesLC( HBufC*& aMessage )
+    {
+    HBufC* certHeading = StringLoader::LoadLC( R_SWCOMMON_DETAIL_CERTIFICATES );
+    HBufC* certificateLink = LoadLinkLC( R_SWCOMMON_DETAIL_VALUE_VIEW_CERT );
+    HBufC* newString = HBufC::NewL( certHeading->Length() + 
+                                    aMessage->Length() + 
+                                    certificateLink->Length() + 
+                                    3 );
+
+    TPtr ptr( newString->Des() );
+    ptr += *aMessage;        
+    ptr += KNextLine;
+    ptr += KNextLine;
+    ptr += *certHeading;
+    ptr += KNextLine;
+    ptr += *certificateLink;
+   
+    CleanupStack::PopAndDestroy( 3, aMessage );
+  
+    aMessage = newString;
+    CleanupStack::PushL( aMessage ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::AddDrmLC
+// Helper to add DRM information to query text.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::AddDrmLC( HBufC*& aMessage )
+    {
+    HBufC* drmHeading = StringLoader::LoadLC( R_SWCOMMON_DETAIL_DRM );
+    HBufC* drmLink = LoadLinkLC( R_SWCOMMON_DETAIL_VALUE_VIEW_DRM );
+    HBufC* newString = HBufC::NewL( drmHeading->Length() + 
+                                    aMessage->Length() + 
+                                    drmLink->Length() + 
+                                    3 );
+
+    TPtr ptr( newString->Des() );
+    ptr += *aMessage;        
+    ptr += KNextLine;
+    ptr += KNextLine;
+    ptr += *drmHeading;
+    ptr += KNextLine;
+    ptr += *drmLink;
+    
+    CleanupStack::PopAndDestroy( 3, aMessage );
+  
+    aMessage = newString;
+    CleanupStack::PushL( aMessage ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ShowCertificates
+// Used as a callback function in message query.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCUIDetailsDialog::ShowCertificates( TAny* ptr )
+    {
+    TInt err( KErrNone );    
+    CCUIDetailsDialog* self = static_cast<CCUIDetailsDialog*>(ptr);
+    TRAP( err, self->DoShowCertificatesL() );
+    return err;    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::ShowDrm
+// Used as a callback function in message query.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CCUIDetailsDialog::ShowDrm( TAny* ptr )
+    {
+    TInt err( KErrNone );    
+    CCUIDetailsDialog* self = static_cast<CCUIDetailsDialog*>(ptr);
+    TRAP( err, self->DoShowDrmL() );
+    return err;    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::DoShowCertificatesL
+// Show CCUICertificateInfo certificates.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::DoShowCertificatesL()
+    {
+    if ( iCommonCertificates.Count() > 1 )
+        {
+        CDesCArrayFlat *itemArray = new( ELeave ) CDesCArrayFlat( 2 );
+        CleanupStack::PushL( itemArray );
+
+        for ( TInt index = 0; index < iCommonCertificates.Count(); index++ )
+            {
+            itemArray->AppendL( iCommonCertificates[index]->IssuerNameL() );            
+            }        
+
+        TInt selection( 0 );
+        TInt dlgResult( EAknSoftkeyOk );
+        
+        while ( dlgResult )
+            {
+            // First show a dialog where user can select the certificate, which
+            // will be viewed in more detail
+            CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selection );
+            dlg->PrepareLC( R_SWCOMMON_SEC_SELECTION_DIALOG );
+            dlg->SetItemTextArray( itemArray );
+            dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
+            dlg->ListBox()->SetCurrentItemIndex( selection );            
+
+            dlgResult = dlg->RunLD();
+            if ( dlgResult )
+                {
+                // Show details about the selected certificate
+                CCUICertificateDetailsDialog* certDlg = 
+                    CCUICertificateDetailsDialog::NewL();
+                
+                certDlg->ExecuteLD( *( iCommonCertificates[selection] ) );    
+                }            
+            }        
+
+        CleanupStack::PopAndDestroy( itemArray );
+        }   
+    else if ( iCommonCertificates.Count() == 1 )
+        {
+        CCUICertificateDetailsDialog* certDlg = 
+            CCUICertificateDetailsDialog::NewL();
+                
+        certDlg->ExecuteLD( *( iCommonCertificates[0] ) );    
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::DoShowDrmL
+// Show detailed drm info.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CCUIDetailsDialog::DoShowDrmL()
+    {
+    CDRMHelper* helper = CDRMHelper::NewLC( *iCoeEnv );
+    helper->LaunchDetailsViewEmbeddedL( iFile );   
+    CleanupStack::PopAndDestroy( helper );    
+    }
+
+// -----------------------------------------------------------------------------
+// CCUIDetailsDialog::LoadLinkLC
+// Helper to construct a message query link from resource string.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+HBufC* CCUIDetailsDialog::LoadLinkLC( TInt aResourceId )
+    {
+    HBufC* link = StringLoader::LoadLC( aResourceId );
+    HBufC* tmp = link->ReAllocL( link->Length() + KLinkTagOpen().Length() + KLinkTagClose().Length() );
+    
+    CleanupStack::Pop( link );
+    link = tmp;
+    CleanupStack::PushL( link );
+    
+    link->Des().Insert(0, KLinkTagOpen);
+    link->Des().Append( KLinkTagClose );   
+
+    return link;    
+    }
+
+//  End of File