--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/vcommandhandler/src/vcommandarray.cpp Thu Dec 17 08:46:30 2009 +0200
@@ -0,0 +1,198 @@
+/*
+* 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