diff -r 000000000000 -r f72a12da539e menufw/hierarchynavigator/hnmetadatamodel/src/hnmditem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/menufw/hierarchynavigator/hnmetadatamodel/src/hnmditem.cpp Thu Dec 17 08:40:49 2009 +0200 @@ -0,0 +1,1078 @@ +/* +* Copyright (c) 2007-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: +* +*/ + + +#include +#include "hnmdquery.h" +#include "hnmdqueries.h" +#include "hnconditioninterface.h" +#include "hnmdmenuitem.h" +#include "hnbuttonmodel.h" +#include "hnmdbutton.h" +#include "hnmdeventmapping.h" +#include "hnmduimapping.h" +#include "hnitemid.h" +#include "hnmdlocalization.h" +#include "hnmdsuite.h" +#include "hnxmlmodelprovider.h" +#include "hnmdaction.h" +#include "hnfilter.h" +#include "hnmdtoolbar.h" +#include "hnmdnotifyrequests.h" +#include "hnmditem.h" +#include "hninterface.h" +#include "hnconditionfactory.h" +#include "hnattributetext.h" +#include "hnsuitemodelcontainer.h" +#include "hnmenuitemmodel.h" +#include "hnitemsorder.h" +#include "hnactionmodel.h" +#include "hnitemmodel.h" +#include "hntoolbarmodel.h" +#include "hnconvutils.h" +#include "hnutils.h" +#include "hnmdbasekey.h" +#include "hnmdservicecommand.h" +#include "hnliwutils.h" +#include "hnstringhandler.h" +#include "hnglobals.h" +#include "menudebug.h" + +using namespace LIW; + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::ConstructL(TXmlEngElement aElement, + THnMdCommonPointers* aCmnPtrs) + { + ASSERT( !aElement.Name().Compare( KItemElementName8 ) + || !aElement.Name().Compare( KEditModeItem8 ) ); + + iCmnPtrs = aCmnPtrs; + + // set count + SetCountL( aElement ); + + // set template + SetTemplateL( aElement.AttributeNodeL( KTemplateAttrName8 ) ); + + // set condition + if( aElement.AttributeValueL( KMenuConditionAttrName8 ).Length() ) + { + iCondition = HnConditionFactory::NewL( + aElement.AttributeNodeL( KMenuConditionAttrName8 ) ); + } + + //set item id + SetItemIdL( aElement ); + + // sets the alternative layout for edit mode + SetEditModeItemL( aElement ); + + // sets move_locked and delete_locked attributes + SetAttributesL( aElement ); + + // sets type of the item + SetTypeL( aElement ); + + // sets uid of the item + SetUidL( aElement ); + + // sets custom id + SetCustomIdL( aElement ); + + // sets msk + SetMiddleSoftKeyL( aElement, aCmnPtrs ); + + //set queries + iQueries = CHnMdQueries::NewL( aElement ); + + //set notify requests + iNotifyRequests = CHnMdNotifyRequests::NewL( aElement, *iItemId, + iCmnPtrs ); + + //set event mapping + iEventMapping = CHnMdEventMapping::NewL( aElement, iCmnPtrs ); + + //set ui mapping + iUiMapping = CHnMdUiMapping::NewL( aElement, iCmnPtrs ); + + //set menu items + iMenu = CHnMdMenuItem::NewL( aElement, iCmnPtrs ); + + //set toolabr element + iToolbar = CHnMdToolbar::NewL( aElement, iCmnPtrs ); + + iQueriesResultsList = CLiwGenericParamList::NewL(); + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetAlternativeModeItem(CHnMdItem* aAlternativeModeItem) + { + iAlternativeModeItem = aAlternativeModeItem; + } +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnMdItem* CHnMdItem::TakeAlternativeModeItem() + { + CHnMdItem * ret = iAlternativeModeItem; + iAlternativeModeItem = NULL; + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CHnMdItem::HasAlternativeModeItem() const + { + return (iAlternativeModeItem != NULL) ? ETrue : EFalse; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetEditModeItemL( TXmlEngElement aElement ) + { + RXmlEngNodeList< TXmlEngElement> children; + CleanupClosePushL ( children ); + aElement.GetChildElements ( children ); + + TInt count = children.Count(); + for (TInt j = 0; j < count ; j++ ) + { + TXmlEngElement item = children.Next(); + + if ( !item.Name().Compare( KEditModeItem8 ) ) + { + iAlternativeModeItem = CHnMdItem::NewL( item, iCmnPtrs ); + iAlternativeModeItem->iItemId->UpdateL( *iItemId ); + break; + } + } + CleanupStack::PopAndDestroy ( &children ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnMdItem* CHnMdItem::NewL(TXmlEngElement aElement, + THnMdCommonPointers* aCmnPtrs) + { + CHnMdItem* self = CHnMdItem::NewLC(aElement, aCmnPtrs); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnMdItem* CHnMdItem::NewLC(TXmlEngElement aElement, + THnMdCommonPointers* aCmnPtrs) + { + CHnMdItem* self = new( ELeave ) CHnMdItem; + CleanupStack::PushL( self ); + self->ConstructL(aElement, aCmnPtrs); + return self; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnMdItem::CHnMdItem() : iAlternativeModeItem(NULL), iAllowableTemplate(NULL) + { + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +CHnMdItem::~CHnMdItem() + { + if ( iNotifyRequests ) + { + CLiwGenericParamList* empty = NULL; + TRAP_IGNORE( iNotifyRequests->SendAllRequestsL( *empty, KLiwOptCancel ) ); + } + + delete iNotifyRequests; + delete iAlternativeModeItem; + delete iAllowableTemplate; + iTemplate.Close(); + delete iMenu; + delete iQueries; + delete iEventMapping; + delete iUiMapping; + delete iItemId; + delete iToolbar; + iRemoveLocked8.Close(); + iRunning8.Close(); + iDrmProtection8.Close(); + iMoveLocked8.Close(); + iType8.Close(); + iUid8.Close(); + iCustomId8.Close(); + iCount8.Close(); + delete iQueriesResultsList; + delete iQc; + delete iCondition; + delete iMsk; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::EvaluateItemItselfL(CHnSuiteModel & aSuiteModel, + CLiwGenericParamList& aParams, TInt aItemPosition ) + { + + DEBUG16(("_MM_: CHnMdItem::EvaluateItemL IN")); + iSuiteModel = &aSuiteModel; + + if ( !iNotifyRequests->Sent() ) + { + iNotifyRequests->SendAllRequestsL( aParams ); + } + + iItemPosition = aItemPosition; + + //allocate memory for new results + iQueriesResultsList->Reset(); + iQueriesResultsList->AppendL( aParams ); + + //delete old query collector and create new one + //currently running evaluations will be cancelled + delete iQc; + iQc = NULL; + iQc = CHnQueryResultCollector::NewL( *iQueries , aParams ); + iQc->StartAsynchL( this ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnMdItem::AddItemL( CHnSuiteModel& aSuiteModel, TInt aItemId, + const CLiwGenericParamList& aQueriesResultsList, TInt aItemModelNumber, + TInt aItemPos ) + { + TInt err( KErrNone ); + CHnItemModel* itemModel = CHnItemModel::NewL(); + CleanupStack::PushL( itemModel ); + + TBool result = FillItemModelL( itemModel, aQueriesResultsList, aItemPos ); + + if ( result ) + { + if ( !itemModel->GetTemplate().Compare( KTemplateEmpty8 ) ) + { + CHnItemModel* empty = aSuiteModel.GetItemModel( aSuiteModel.IdByIndex( -1 ) ); + // empty has been already added + if ( empty ) + { + err = KErrAlreadyExists; + } + } + } + else + { + err = KErrGeneral; + } + + if( KErrNone == err ) + { + aSuiteModel.AddItemL( aItemId, itemModel, aItemModelNumber, aItemPos ); + CleanupStack::Pop( itemModel ); + } + else + { + CleanupStack::PopAndDestroy( itemModel ); + itemModel = NULL; + } + return err; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnMdItem::UpdateItemL( CHnSuiteModel & aSuiteModel, TInt aItemId, + const CLiwGenericParamList& aQueriesResultsList, TInt aItemPos ) + { + TBool result = ETrue; + CHnItemModel* itemModel = aSuiteModel.GetItemModel( aItemId ); + itemModel->ClearAttributesL(); + result = FillItemModelL( itemModel, aQueriesResultsList, aItemPos ); + if( result ) + { + aSuiteModel.UpdateItemTemplateL( aItemId ); + } + return result ? KErrNone : KErrGeneral; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::RemoveItemL( CHnSuiteModel & aSuiteModel, TInt aId ) + { + //TInt id = iIds[ aPosition ]; + //iIds.Remove( aPosition ); + aSuiteModel.RemoveItemL( aId ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::EvaluateItemL( CHnSuiteModel & aSuiteModel, + CLiwGenericParamList& aParamList, + TInt aItemPosition ) + { + if( iEvaluationNeeded ) + { + EvaluateItemItselfL( aSuiteModel, aParamList, aItemPosition ); + iEvaluationNeeded = EFalse; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::MarkEvaluationL( CHnFilter& aFilter ) + { + if( aFilter.HasItemIds() ) + { + aFilter.ResetIterator(); + while( aFilter.HasNextItemId() && !iEvaluationNeeded ) + { + const CHnItemId* item = aFilter.GetNextItemId(); + if( iItemId->Compare( *item ) ) + { + iEvaluationNeeded = ETrue; + } + } + } + else + { + iEvaluationNeeded = ETrue; + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnMdItem::EvaluateItemL( CHnSuiteModel & aSuiteModel, + const CHnItemId* aItemId, CLiwGenericParamList& aParamList, + TInt aItemPosition ) + { + DEBUG(("_MM_: CHnMdItem::EvaluateItemL IN")); //TO CHANGE LATER (id : %S)", iItemId->Id())); + TInt result( KErrNotFound ); + if( iItemId->Compare( *aItemId ) ) + { + EvaluateItemItselfL( aSuiteModel, aParamList, aItemPosition ); + result = KErrNone; + } + DEBUG(("_MM_: CHnMdItem::EvaluateItemL OUT")); + return result; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnMdItem::GetIndexValuesFromOutputsL( RPointerArray < HBufC8 > &aValues, + TXmlEngElement aElement ) + { + RXmlEngNodeList < TXmlEngElement > children; + CleanupClosePushL( children ); + aElement.GetChildElements( children ); + TInt amount = children.Count(); + + TPtrC8 n = aElement.Name(); + + for( TInt j( 0 ); j < amount; j++ ) + { + TXmlEngElement item = children.Next(); + + if ( !item.Name().Compare( KOutputElementItem8 ) ) + { + if ( item.HasAttributeL( KValueAttrName8 ) && + item.AttributeValueL( KValueAttrName8 ).Find( KIndex8 ) >= 0 && + item.HasAttributeL( KAliasAttrName8 ) && + !item.AttributeValueL( KAliasAttrName8 ).Compare( KTitle8 ) ) + { + TInt pos = item.AttributeValueL( KValueAttrName8 ).Find( KIndexWithBrackets8 ) - 1; + TInt siz = KCount().Length(); + TInt len = pos + siz; + TInt len0 = item.AttributeValueL( KValueAttrName8 ).Length() + KCount().Length(); + + HBufC8* buf = HBufC8::NewL( len0 ); + buf->Des().Copy( item.AttributeValueL( KValueAttrName8 ) ); + buf->Des().Replace( pos, siz, KCount() ); + buf->Des().SetLength( len ); + aValues.Append( buf ); + } + } + } + + CleanupStack::PopAndDestroy( &children ); + return aValues.Count(); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetCountL( TXmlEngElement aElement ) + { + TXmlEngAttr aAttr = aElement.AttributeNodeL( KCountAttrName8 ); + iCount8.Close(); + iCount8.CreateL( aAttr.Value() ); + + // replace "*" + if ( !iCount8.Compare( KStar8 ) ) + { + RPointerArray values; + CleanupClosePushL( values ); + if( GetIndexValuesFromOutputsL( values, aElement ) > 0 ) + { + for( TInt i = 0; i < values.Count(); i++ ) + { + HBufC8* buf = values[i]; + iCount8.Close(); + iCount8.CreateL( buf->Length() ); + iCount8.Copy( *buf ); + } + } + else + { + iCount8.Close(); + iCount8.CreateL( KDefaultCount8().Length() ); + iCount8.Copy( KDefaultCount8 ); + } + values.ResetAndDestroy(); + CleanupStack::PopAndDestroy( &values ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetTemplateL( TXmlEngAttr aAttr ) + { + iAllowableTemplate = new ( ELeave ) CDesC8ArrayFlat( 3 ); + + for (int i = 0; i < HnUtils::GetColumnTextColumnCount(aAttr.Value()); i++) + { + HBufC8* templateBuf = HnUtils::GetColumnTextLC( i, aAttr.Value() ); + templateBuf->Des().Trim(); + iAllowableTemplate->AppendL( *templateBuf ); + CleanupStack::PopAndDestroy(templateBuf); + } + + if (iAllowableTemplate->Count() > 0 ) + { + const TDesC8 & val = (*iAllowableTemplate)[0]; + iTemplate.Close(); + iTemplate.CreateL( val.Length() + 1 ); + iTemplate.Copy( val ); + } + else + iTemplate.CreateL( KNullDesC8() ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetTemplateL( CHnItemModel* aItemModel ) + { + ASSERT( aItemModel ); + CHnAttributeText* templateAttr = CHnAttributeText::NewL(); + templateAttr->SetNameL( KTemplate8 ); + templateAttr->SetValueL( iTemplate ); + aItemModel->SetAttributeL( templateAttr ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetAlternativeTemplateL( TInt aOption ) + { + if ( !iTemplate.Compare( KTemplateEmpty8 ) ) + { + return; + } + iTemplate.Close(); + if (aOption >=0 && aOption < iAllowableTemplate->Count()) + { + const TDesC8 & val = (*iAllowableTemplate)[aOption]; + iTemplate.CreateL( val.Length() + 1 ); + iTemplate.Copy( val ); + } + else + { + iTemplate.CreateL( KNullDesC8() ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetItemIdL( TXmlEngElement aItemElement ) + { + HBufC* suiteName = HnConvUtils::Str8ToStrLC( + aItemElement.AttributeNodeL( KSuiteElementName8 ).Value() ); + HBufC* itemId = HnConvUtils::Str8ToStrLC( + aItemElement.AttributeNodeL( KItemIdAttrName8 ).Value() ); + + iItemId = CHnItemId::NewL( *suiteName, *itemId ); + + CleanupStack::PopAndDestroy( itemId ); + CleanupStack::PopAndDestroy( suiteName ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetDeleteMoveAttributesL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + aItemModel->ClearFlags(); + TLiwVariant moveLocked; + moveLocked.PushL(); + HnLiwUtils::GetVariantL( aQueriesResultsList, iMoveLocked8, aPos, moveLocked ); + if ( moveLocked == TLiwVariant( (TBool) ETrue ) ) + { + aItemModel->SetFlag( EItemFlagMoveLocked ); + } + CleanupStack::PopAndDestroy( &moveLocked ); + + TLiwVariant deleteLocked; + deleteLocked.PushL(); + HnLiwUtils::GetVariantL( aQueriesResultsList, iRemoveLocked8, aPos, deleteLocked ); + if ( deleteLocked == TLiwVariant( (TBool) ETrue ) ) + { + aItemModel->SetFlag( EItemFlagRemoveLocked ); + } + CleanupStack::PopAndDestroy( &deleteLocked ); + + TLiwVariant running; + running.PushL(); + HnLiwUtils::GetVariantL( aQueriesResultsList, iRunning8, aPos, running ); + if ( running == TLiwVariant( (TBool) ETrue ) ) + { + aItemModel->SetFlag( EItemFlagRunning ); + } + CleanupStack::PopAndDestroy( &running ); + + TLiwVariant drm; + drm.PushL(); + HnLiwUtils::GetVariantL( aQueriesResultsList, iDrmProtection8, aPos, drm ); + TPtrC drmRights; + drm.Get( drmRights ); + if ( !drmRights.Compare( KMenuDrmRightsExpired ) ) + { + aItemModel->SetFlag( EItemFlagDrmExpired ); + } + CleanupStack::PopAndDestroy( &drm ); + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetTypeL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + RBuf8 type; + CleanupClosePushL( type ); + HnLiwUtils::GetStringL( aQueriesResultsList, iType8, aPos, type ); + aItemModel->SetType( type ); + CleanupStack::PopAndDestroy( &type ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetUidL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + RBuf8 uid; + CleanupClosePushL( uid ); + HnLiwUtils::GetStringL( aQueriesResultsList, iUid8, aPos, uid ); + aItemModel->SetItemUidL( uid ); + CleanupStack::PopAndDestroy( &uid ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetCustomIdL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aParams, TInt aPos ) + { + TInt64 customId( KErrNotFound ); + if ( KErrNone == HnLiwUtils::GetInt64L( + aParams, iCustomId8, aPos, customId ) ) + { + aItemModel->SetCustomId( customId ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CHnMdItem::FillItemModelL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + TBool result( EFalse ); + + // set template for item + SetTemplateL( aItemModel ); + + // set delete/move locked attributes + SetDeleteMoveAttributesL( aItemModel, aQueriesResultsList, aPos ); + + // set type of an item + SetTypeL( aItemModel, aQueriesResultsList, aPos ); + + // set uid of an item + SetUidL( aItemModel, aQueriesResultsList, aPos ); + + // set custom id + SetCustomIdL( aItemModel, aQueriesResultsList, aPos ); + + // fills mul item + TRAP_IGNORE( result = iUiMapping->FillGraphicalItemL( + aItemModel, aQueriesResultsList, aPos ) ); + + if ( result ) + { + // fills item model + FillItemModelWithMenuItemsL( aItemModel, aQueriesResultsList, aPos ); + FillItemModelWithToolbarL( aItemModel, aQueriesResultsList, aPos ); + FillItemModelWithMiddleSoftKeyL( aItemModel, aQueriesResultsList, + aPos ); + + aItemModel->DeleteAllActionModels(); + iEventMapping->FillActionsL( aItemModel->GetActions(), + aQueriesResultsList, aPos ); + } + return result; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::FillItemModelWithMenuItemsL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + CHnMenuItemModel* menu = CHnMenuItemModel::NewL( KMenuItemName() ); + CleanupStack::PushL( menu ); + iMenu->EvaluateL( menu, aQueriesResultsList, aPos ); + aItemModel->SetMenuItemModel( menu ); + CleanupStack::Pop( menu ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::FillItemModelWithToolbarL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + CHnToolbarModel* toolbar = CHnToolbarModel::NewLC(); + iToolbar->EvaluateL( toolbar, aQueriesResultsList, aPos ); + aItemModel->SetToolbarModel( toolbar ); + CleanupStack::Pop( toolbar ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::FillItemModelWithMiddleSoftKeyL( CHnItemModel* aItemModel, + const CLiwGenericParamList& aQueriesResultsList, TInt aPos ) + { + if ( iMsk ) + { + CHnButtonModel* msk = CHnButtonModel::NewLC( iMsk->GetIndex() ); + const TDesC& helpText = iMsk->EvaluateButtonTextL( + aQueriesResultsList, aPos ); + msk->SetHelpTextL( helpText ); + aItemModel->SetMiddleSoftKey( msk ); + CleanupStack::Pop( msk ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TBool CHnMdItem::IsValidL( const CLiwGenericParamList& aQueryResults, + TInt aPos ) + { + TBool ret( EFalse ); + if( !iCondition || iCondition->ResultL( aQueryResults, aPos ) ) + { + ret = ETrue; + } + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// + +TBool CHnMdItem::CompareItems( CHnItemId* aSearchCriteria ) + { + return iItemId->Compare( *aSearchCriteria ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetAttributesL( TXmlEngElement aElement ) + { + iMoveLocked8.Close(); + iRemoveLocked8.Close(); + iRunning8.Close(); + iDrmProtection8.Close(); + + if ( aElement.HasAttributeL( KMoveLocked8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KMoveLocked8 ); + iMoveLocked8.CreateL( av ); + } + else + { + iMoveLocked8.CreateL( KStringFalse8 ); + } + + if ( aElement.HasAttributeL( KRemoveLocked8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KRemoveLocked8 ); + iRemoveLocked8.CreateL( av ); + } + else + { + iRemoveLocked8.CreateL( KStringFalse8 ); + } + + if ( aElement.HasAttributeL( KRunning8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KRunning8 ); + iRunning8.CreateL( av ); + } + else + { + iRunning8.CreateL( KStringFalse8 ); + } + + if ( aElement.HasAttributeL( KDrmProtection8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KDrmProtection8 ); + iDrmProtection8.CreateL( av ); + } + else + { + iDrmProtection8.CreateL( KMenuDrmUnknown8 ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetTypeL( TXmlEngElement aElement ) + { + iType8.Close(); + + if ( aElement.HasAttributeL( KItemType8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KItemType8 ); + iType8.CreateL( av ); + } + else + { + iType8.CreateL( KItemTypeUnknown8 ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetUidL( TXmlEngElement aElement ) + { + iUid8.Close(); + + if ( aElement.HasAttributeL( KItemUid8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KItemUid8 ); + iUid8.CreateL( av ); + } + else + { + iUid8.CreateL( TUid::Null().Name().Length() ); + iUid8.Append( TUid::Null().Name() ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetCustomIdL( TXmlEngElement aElement ) + { + iCustomId8.Close(); + + if ( aElement.HasAttributeL( KCustomId8 ) ) + { + TPtrC8 av = aElement.AttributeValueL( KCustomId8 ); + iCustomId8.CreateL( av ); + } + else + { + iCustomId8.CreateL( KItemTypeUnknown8 ); + } + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::SetMiddleSoftKeyL( TXmlEngElement aElement, + THnMdCommonPointers* aCmnPtrs ) + { + RXmlEngNodeList< TXmlEngElement> children; + CleanupClosePushL ( children ); + aElement.GetChildElements ( children ); + TInt count = children.Count(); + for (TInt i = 0; i < count; i++ ) + { + TXmlEngElement item = children.Next(); + + if ( !item.Name().Compare( KMiddleSoftKey8 ) ) + { + iMsk = CHnMdButton::NewLC( item, aCmnPtrs ); + CleanupStack::Pop( iMsk ); + break; + } + } + CleanupStack::PopAndDestroy( &children ); + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CHnMdItem::Template() + { + return iTemplate; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CHnMdItem::Type() + { + return iType8; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CHnMdItem::Uid() + { + return iUid8; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +TInt CHnMdItem::GetItemsMaxCountL() + { + TInt ret( KErrNotFound ); + + // check if iCount8 equals "*" + if ( !iCount8.Compare( KStar8() ) ) + { + ret = KErrUnknown; + } + // check if iCount8 is a number + else if ( HnConvUtils::Str8ToInt( iCount8, ret ) >= 0 ) + { + ; // ret contains a number + } + // try to retrieve number of items from given paths + else + { + TInt columnsCount( HnUtils::GetColumnTextColumnCount( iCount8 ) ); + for (int i = 0; i < columnsCount; i++) + { + HBufC8* tmpCountBuf = HnUtils::GetColumnTextLC( i, iCount8 ); + TInt pos = tmpCountBuf->Des().Find( KCount() ); + + if ( pos >= 0 ) + { + tmpCountBuf->Des().Replace( pos, KCount().Length(), KNullDesC8 ); + TLiwVariant variant; + variant.PushL(); + HnLiwUtils::GetVariantL( *iQueriesResultsList, *tmpCountBuf, variant ); + + const CLiwList* list = variant.AsList(); + CLiwIterable* iterable = variant.AsIterable(); + TInt count = KErrNotFound; + if ( list ) + { + count = list->Count(); + } + else if ( iterable ) + { + count = HnLiwUtils::GetIterableItemCountL( *iterable ); + } + + if ( count != KErrNotFound ) + { + if ( ( i == 0 ) || ( ( i > 0 ) && ( count < ret ) ) ) + { + ret = count; + } + } + CleanupStack::PopAndDestroy( &variant ); + } + + CleanupStack::PopAndDestroy( tmpCountBuf ); + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +// +void CHnMdItem::ResultsCollectedL( CLiwGenericParamList* aResults ) + { + iQueriesResultsList->AppendL( *aResults ); + + RArray< TInt > ids; + CleanupClosePushL( ids ); + iSuiteModel->GetItemsOrder()->GetIdsForL( iItemPosition, ids ); + TInt startCount = ids.Count(); + TInt visibleItemsBeforeEvaluation = iSuiteModel->GetItemsOrder()->Count(); + TInt id( 0 ); + + TBool result = ETrue; + TInt itemCounter = 0; + + TInt maxCount( GetItemsMaxCountL() ); + + for ( TInt i(0); result; i++, itemCounter++) + { + result = ( maxCount != KErrUnknown ) ? i < maxCount && result : result; + + if ( !result ) + { + continue; + } + + id = (ids.Count() > 0 && i < ids.Count()) ? ids[itemCounter] + : KErrNotFound; + + if( id == KErrNotFound ) + { + id = iCmnPtrs->iIdGenerator->GetNextId(); + TInt err = AddItemL( *iSuiteModel, id, *iQueriesResultsList, + iItemPosition, itemCounter ); + if ( KErrAlreadyExists == err ) + { + // update empty item which is identified by "-1" + TInt err = UpdateItemL( *iSuiteModel, iSuiteModel->IdByIndex(-1), *iQueriesResultsList, i ); + result = ( KErrNone == err ) ? ETrue : EFalse; + } + else if ( KErrNone != err ) + { + result = EFalse; + } + } + else + { + TInt err = UpdateItemL( *iSuiteModel, id, *iQueriesResultsList, i ); + result = ( KErrNone == err ) ? ETrue : EFalse; + } + + if ( !IsValidL( *iQueriesResultsList, i ) ) + { + RemoveItemL( *iSuiteModel, id ); + itemCounter--; + continue; + } + } + + for( TInt it(startCount - 1); it >= itemCounter -1 && it >= 0; it-- ) + { + RemoveItemL( *iSuiteModel, ids[it] ); + } + + CleanupStack::PopAndDestroy( &ids ); + iSuiteModel->RefreshMulModelL( visibleItemsBeforeEvaluation ); + TBool observersNotified = + iSuiteModel->ItemEvaluationFinishedL( iItemPosition ); + if ( observersNotified ) + { + iCmnPtrs->iModel->SuiteModelReadyToShowL( iSuiteModel ); + } + + DEBUG(("_MM_: CHnMdItem::ResultsCollectedL OUT")); + } + +// End of file