srsf/vcommandhandler/src/vcommandarray.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2006 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 the CVCommandRunnable class
*
*/



#include <vcommandapi.h>
#include "rubydebug.h"

/** 
* Constructs the non-modifiable CVCommandArray
* @param aSource Commands to store. CVCommandArray makes
*        copies of them
*/
EXPORT_C CVCommandArray* CVCommandArray::NewL( const RVCommandArray& aSource )
	{
	RUBY_DEBUG_BLOCK( "CVCommandArray::NewL" );
	CVCommandArray* self = new (ELeave) CVCommandArray;
	CleanupStack::PushL( self );
	self->ConstructL( aSource );
	CleanupStack::Pop( self );
	return self;
	}
	
void CVCommandArray::ConstructL( const RVCommandArray& aSource )
	{
	RUBY_DEBUG_BLOCKL( "CVCommandArray::ConstructL" );
	iCommands.ResetAndDestroy();
	for( TInt j = 0; j < aSource.Count(); j++ ) 
		{
		CVCommand* addition = CVCommand::NewL( *aSource[j] );
		CleanupStack::PushL( addition );
		iCommands.AppendL( addition );
		CleanupStack::Pop( addition );
		}
	}	

/**
* Destructor
*/
EXPORT_C CVCommandArray::~CVCommandArray()
	{
	RUBY_DEBUG0( "CVCommandArray::~CVCommandArray start" );
	iCommands.ResetAndDestroy();
	RUBY_DEBUG0( "CVCommandArray::~CVCommandArray end" );
	}

/**
* Returns the reference to the command stored in this
* CVCommandArray
* @param aIndex Zero-based index of the command. If aIndex is out of
*               bounds, this method will panic with USER 130
* @return Unmodifiable reference to CVCommand
*/
EXPORT_C const CVCommand& CVCommandArray::At( TInt aIndex ) const
	{
	return *iCommands[ aIndex ];
	}

/**
* Equivalent to the operator At
* @see At()
*/
EXPORT_C const CVCommand& CVCommandArray::operator[]( TInt aIndex ) const
	{
	return At( aIndex );
	}

/** 
* Returns the number of commands
*/
EXPORT_C TInt CVCommandArray::Count() const
	{
	return iCommands.Count();
	}

/**
* For the compatibility with routines, requiring RVCommandArray
* @return Unmodifiable array of pointers to VCommands
*/
EXPORT_C const RVCommandArray& CVCommandArray::PointerArray() const
    {
    return iCommands;
    }

/**
 * Figures out which commands have to untrained (removed from VCommandHandler)
 * if this command set is merged with aUpdates.
 * Merging is performed on the basis of comapring the commands' Runnable component
 * If runnables are equal, the commands are considered being equal.
 * It is useful e.g. when figuring out what to (un)train after the language change
 * 
 * @param aUpdates Set of commands to merge in. 
 * @return Set of commands to be removed from the system if the merging takes place
 */
EXPORT_C CVCommandArray* CVCommandArray::ProduceUntrainSetByRunnablesLC( 
                            const RVCommandArray& aUpdates ) const
    {
    RVCommandArray deduction;
    CleanupClosePushL( deduction );
    for( TInt i = 0; i < Count(); i++ )
        {
        for( TInt j = 0; j < aUpdates.Count(); j++ )
            {
            if( ( At(i).Runnable() == aUpdates[j]->Runnable() ) &&
                !( At(i).EqualNonUserChangeableData( *aUpdates[j] ) ) 
               )
                { 
                deduction.AppendL( &At(i) );
                break;
                }
            }
        }
    CVCommandArray* result = CVCommandArray::NewL( deduction );
    CleanupStack::PopAndDestroy( &deduction );
    CleanupStack::PushL( result );
    return result;
    }
    
/**
 * Figures out which commands have to trained (removed added to the system)
 * if this command set is merged with aUpdates.
 * Merging is performed on the basis of comapring the commands' Runnable component
 * If runnables are equal, the commands are considered being equal.
 * It is useful e.g. when figuring out what to (un)train after the language change
 * 
 * @param aUpdates Set of commands to merge in. 
 * @return Set of commands to be added to the system if the merging takes place
 * @see ProduceUntrainSetByRunnables
 */
EXPORT_C CVCommandArray* CVCommandArray::ProduceTrainSetByRunnablesLC( 
                            const RVCommandArray& aUpdates ) const
    {
    RVCommandArray addition;
    CleanupClosePushL( addition );
    for( TInt j = 0; j < aUpdates.Count(); j++ )
        {
        TBool injectedMatchesSomeTarget = EFalse;
        for( TInt i = 0; i < Count(); i++ )
            {
            if( At(i).EqualNonUserChangeableData( *aUpdates[j] ) )
                { 
                injectedMatchesSomeTarget = ETrue;
                break;
                }
            else if( At(i).Runnable() == aUpdates[j]->Runnable() &&
                     At(i).CommandUi().UserText() != KNullDesC )
                {
                CVCCommandUi* updatedCommandUi( NULL );
                updatedCommandUi = CVCCommandUi::NewL( aUpdates[j]->CommandUi().WrittenText(), 
                                                       aUpdates[j]->CommandUi().FolderInfo(),
                                                       aUpdates[j]->CommandUi().Modifiable(),
                                                       aUpdates[j]->CommandUi().Tooltip(), 
                                                       aUpdates[j]->CommandUi().IconUid(),
                                                       At(i).CommandUi().UserText(),
                                                       aUpdates[j]->CommandUi().ConfirmationNeeded() );
                CleanupStack::PushL( updatedCommandUi );

                CVCommand* updatedCommand( NULL );
                updatedCommand = CVCommand::NewL( aUpdates[j]->SpokenText(),
                                                  aUpdates[j]->Runnable(),
                                                  *updatedCommandUi );
                CleanupStack::PushL( updatedCommand );

                addition.AppendL( updatedCommand );

                CleanupStack::Pop( updatedCommand );
                CleanupStack::PopAndDestroy( updatedCommandUi );
                
                injectedMatchesSomeTarget = ETrue;
                break;
                }
            }  // for i
        if( !injectedMatchesSomeTarget )
            {
            addition.AppendL( aUpdates[j] );
            }  // if
        }  // for j
    CVCommandArray* result = CVCommandArray::NewL( addition );
    CleanupStack::PopAndDestroy( &addition );
    CleanupStack::PushL( result );
    return result;
    }
    
//End of file