appinstaller/AppMngr2/src/appmngr2log.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 12:04:39 +0000
branchRCL_3
changeset 84 e6c5e34cd9b9
parent 0 ba25891c3a9e
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

/*
* 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:   Shows installation log in a popup list dialog
*
*/


#include "appmngr2log.h"                // CAppMngr2Log
#include "appmngr2logpopuplist.h"       // CAppMngr2LogPopupList
#include "appmngr2logdatabase.h"        // CAppMngr2LogDatabase
#include "appmngr2logdatabaseentry.h"   // CAppMngr2LogDatabaseEntry
#include <appmngr2.rsg>                 // Resource IDs
#include <aknlists.h>                   // CAknDoublePopupMenuStyleListBox
#include <StringLoader.h>               // Stingloader

const TInt KMaxNumberOfShownLogItems = 50;
const TInt KInstDateTimeTextLength = 64;
const TInt KInstActionTextLength = 64;
const TInt KInstLogLineTextLen = KInstDateTimeTextLength +
    KInstActionTextLength + SwiUI::KMaxLogNameLength;

// Date and action separated by " - "
_LIT( KSeparator, " - " );
_LIT( KVersionPrefix, " (" );
_LIT( KVersionSuffix, ")" );


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

// ---------------------------------------------------------------------------
// CAppMngr2Log::CAppMngr2Log()
// ---------------------------------------------------------------------------
//
CAppMngr2Log::CAppMngr2Log( CEikonEnv& aEikEnv ) : iEikEnv( aEikEnv )
    {
    }

// ---------------------------------------------------------------------------
// CAppMngr2Log::NewLC()
// ---------------------------------------------------------------------------
//
CAppMngr2Log* CAppMngr2Log::NewLC()
    {
    CAppMngr2Log* self = new (ELeave) CAppMngr2Log( *( CEikonEnv::Static() ) );
    CleanupStack::PushL( self );
    return self;
    }

// ---------------------------------------------------------------------------
// CAppMngr2Log::~CAppMngr2Log()
// ---------------------------------------------------------------------------
//
CAppMngr2Log::~CAppMngr2Log()
    {
    }

// ---------------------------------------------------------------------------
// CAppMngr2Log::ShowInstallationLogL()
// ---------------------------------------------------------------------------
//
void CAppMngr2Log::ShowInstallationLogL()
    {    
    CEikFormattedCellListBox* listBox = new (ELeave) CAknDoublePopupMenuStyleListBox;
    CleanupStack::PushL( listBox );

    // AppMngr version of Avkon popup list with heading
    CAppMngr2LogPopupList* popupList = CAppMngr2LogPopupList::NewL(
            listBox, R_AVKON_SOFTKEYS_OK_EMPTY__OK, AknPopupLayouts::EMenuDoubleWindow );
    CleanupStack::PushL( popupList );
    
    // Set title text
    HBufC* title = StringLoader::LoadLC( R_INST_LOG_HEADER );
    popupList->SetTitleL( *title );
    CleanupStack::PopAndDestroy( title );

    // Set listbox properties and create item array
    listBox->ConstructL( popupList, EAknListBoxViewerFlags );
    listBox->CreateScrollBarFrameL( ETrue );
    listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
            CEikScrollBarFrame::EAuto );
    MDesCArray* itemList = listBox->Model()->ItemTextArray();
    CDesCArray* itemArray = static_cast<CDesCArray*>( itemList );    
    ConstructLogArrayL( itemArray );

    // Set empty text
    CListBoxView* view = listBox->View();
    HBufC* emptyText = StringLoader::LoadLC( R_QTN_SWINS_LOG_EMPTY );
    view->SetListEmptyTextL( *emptyText );
    CleanupStack::PopAndDestroy( emptyText );
    
    // Lauch popup list
    popupList->ExecuteLD();

    CleanupStack::Pop( popupList );
    CleanupStack::PopAndDestroy( listBox );
    }

// ---------------------------------------------------------------------------
// CAppMngr2Log::ConstructLogArrayL()
// ---------------------------------------------------------------------------
//
void CAppMngr2Log::ConstructLogArrayL( CDesCArray* aItemArray )
    {
    CAppMngr2LogDatabase* log = CAppMngr2LogDatabase::NewL();
    CleanupStack::PushL( log );

    const RPointerArray<CAppMngr2LogDatabaseEntry>& logEntries = log->Entries();
    
    // Read KMaxNumberOfShownLogItems first log entries, ignore the rest 
    TInt length = logEntries.Count();
    TInt diff = length - KMaxNumberOfShownLogItems;

    // Add entries from the latest log item (reverse order) into item array
    for( TInt index = length - 1; index >= diff && index >= 0; index-- )
        {
        if( logEntries[ index ] )
            {
            const CAppMngr2LogDatabaseEntry& entry = *( logEntries[ index ] );
    
            HBufC* buffer = HBufC::NewMaxLC( KInstLogLineTextLen );
            TPtr listboxLine = buffer->Des();
            listboxLine.Zero();
    
            // First row in double list item contains application name
            listboxLine.Append( entry.Name() );
            listboxLine.Append( KVersionPrefix );
            listboxLine.Append( entry.Version() );
            listboxLine.Append( KVersionSuffix );
            listboxLine.Append( KColumnListSeparator );
            
            // Second row contains date and action type (install/uninstall/partial)
            SetLogDateTimeColumnL( listboxLine, entry.Time() );
            listboxLine.Append( KSeparator );
            SetLogActionTextColumnL( listboxLine, entry.Action() );
    
            aItemArray->AppendL( listboxLine );
            CleanupStack::PopAndDestroy( buffer );
            }
        }
        
    CleanupStack::PopAndDestroy( log );
    }

// ---------------------------------------------------------------------------
// CAppMngr2Log::SetLogActionTextColumnL()
// ---------------------------------------------------------------------------
//
void CAppMngr2Log::SetLogActionTextColumnL( TDes& aListboxLine,
        const SwiUI::TLogTaskAction& aAction )
    {
    TBuf<KInstActionTextLength> action;
    switch( aAction )
        {
        case SwiUI::ELogTaskActionInstall:
            iEikEnv.ReadResourceL( action, R_INST_INSTALL_EVENT );
            break;
        case SwiUI::ELogTaskActionUninstall:
            iEikEnv.ReadResourceL( action, R_INST_REMOVE_EVENT );
            break;
        // no action for R_INST_PARTIAL_INSTALL_EVENT, not supported
        default:
            break;
        }
    aListboxLine.Append( action );
    }

// ---------------------------------------------------------------------------
// CAppMngr2Log::SetLogDateTimeColumnL()
// ---------------------------------------------------------------------------
//
void CAppMngr2Log::SetLogDateTimeColumnL( TDes& aListboxLine,
        const TTime& aDateTime )
    {
    TBuf<KInstDateTimeTextLength> tempBuf;
    TBuf<KInstDateTimeTextLength> dateFormat;
    iEikEnv.ReadResourceL( dateFormat, R_QTN_DATE_USUAL_WITH_ZERO );   
    aDateTime.FormatL( tempBuf, dateFormat );
    AknTextUtils::DisplayTextLanguageSpecificNumberConversion( tempBuf );
    aListboxLine.Append( tempBuf );
    }