menufw/hierarchynavigator/hnmetadatamodel/src/hnmditem.cpp
changeset 0 f72a12da539e
equal deleted inserted replaced
-1:000000000000 0:f72a12da539e
       
     1 /*
       
     2 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 #include <liwservicehandler.h>
       
    20 #include "hnmdquery.h"
       
    21 #include "hnmdqueries.h"
       
    22 #include "hnconditioninterface.h"
       
    23 #include "hnmdmenuitem.h"
       
    24 #include "hnbuttonmodel.h"
       
    25 #include "hnmdbutton.h"
       
    26 #include "hnmdeventmapping.h"
       
    27 #include "hnmduimapping.h"
       
    28 #include "hnitemid.h"
       
    29 #include "hnmdlocalization.h"
       
    30 #include "hnmdsuite.h"
       
    31 #include "hnxmlmodelprovider.h"
       
    32 #include "hnmdaction.h"
       
    33 #include "hnfilter.h"
       
    34 #include "hnmdtoolbar.h"
       
    35 #include "hnmdnotifyrequests.h"
       
    36 #include "hnmditem.h"
       
    37 #include "hninterface.h"
       
    38 #include "hnconditionfactory.h"
       
    39 #include "hnattributetext.h"
       
    40 #include "hnsuitemodelcontainer.h"
       
    41 #include "hnmenuitemmodel.h"
       
    42 #include "hnitemsorder.h"
       
    43 #include "hnactionmodel.h"
       
    44 #include "hnitemmodel.h"
       
    45 #include "hntoolbarmodel.h"
       
    46 #include "hnconvutils.h"
       
    47 #include "hnutils.h"
       
    48 #include "hnmdbasekey.h"
       
    49 #include "hnmdservicecommand.h"
       
    50 #include "hnliwutils.h"
       
    51 #include "hnstringhandler.h"
       
    52 #include "hnglobals.h"
       
    53 #include "menudebug.h"
       
    54 
       
    55 using namespace LIW;
       
    56 
       
    57 // ======== MEMBER FUNCTIONS ========
       
    58 
       
    59 // ---------------------------------------------------------------------------
       
    60 //
       
    61 // ---------------------------------------------------------------------------
       
    62 //
       
    63 void CHnMdItem::ConstructL(TXmlEngElement aElement,
       
    64                                 THnMdCommonPointers* aCmnPtrs)
       
    65     {
       
    66     ASSERT( !aElement.Name().Compare( KItemElementName8 ) 
       
    67             || !aElement.Name().Compare( KEditModeItem8 ) );
       
    68 
       
    69     iCmnPtrs = aCmnPtrs;
       
    70     
       
    71     // set count
       
    72     SetCountL( aElement );
       
    73 
       
    74     // set template
       
    75     SetTemplateL( aElement.AttributeNodeL( KTemplateAttrName8 ) );
       
    76 
       
    77     // set condition
       
    78     if( aElement.AttributeValueL( KMenuConditionAttrName8 ).Length() )
       
    79         {
       
    80         iCondition = HnConditionFactory::NewL( 
       
    81                 aElement.AttributeNodeL( KMenuConditionAttrName8 ) );
       
    82         }
       
    83 
       
    84     //set item id
       
    85     SetItemIdL( aElement );
       
    86 
       
    87     // sets the alternative layout for edit mode
       
    88     SetEditModeItemL( aElement );
       
    89     
       
    90     // sets move_locked and delete_locked attributes
       
    91     SetAttributesL( aElement );
       
    92     
       
    93     // sets type of the item
       
    94     SetTypeL( aElement );
       
    95     
       
    96     // sets uid of the item
       
    97     SetUidL( aElement );
       
    98     
       
    99     // sets custom id
       
   100     SetCustomIdL( aElement );
       
   101     
       
   102     // sets msk
       
   103     SetMiddleSoftKeyL( aElement, aCmnPtrs );
       
   104     
       
   105     //set queries
       
   106     iQueries = CHnMdQueries::NewL( aElement );
       
   107 
       
   108     //set notify requests
       
   109     iNotifyRequests = CHnMdNotifyRequests::NewL( aElement, *iItemId, 
       
   110             iCmnPtrs );
       
   111     
       
   112     //set event mapping
       
   113     iEventMapping = CHnMdEventMapping::NewL( aElement, iCmnPtrs );
       
   114 
       
   115     //set ui mapping
       
   116     iUiMapping = CHnMdUiMapping::NewL( aElement, iCmnPtrs );
       
   117 
       
   118     //set menu items
       
   119     iMenu = CHnMdMenuItem::NewL( aElement, iCmnPtrs );
       
   120 
       
   121     //set toolabr element
       
   122     iToolbar = CHnMdToolbar::NewL( aElement, iCmnPtrs );
       
   123          
       
   124     iQueriesResultsList = CLiwGenericParamList::NewL();
       
   125     }
       
   126 
       
   127 
       
   128 // ---------------------------------------------------------------------------
       
   129 //
       
   130 // ---------------------------------------------------------------------------
       
   131 //
       
   132 void CHnMdItem::SetAlternativeModeItem(CHnMdItem* aAlternativeModeItem)
       
   133     {
       
   134     iAlternativeModeItem = aAlternativeModeItem;
       
   135     }
       
   136 // ---------------------------------------------------------------------------
       
   137 //
       
   138 // ---------------------------------------------------------------------------
       
   139 //
       
   140 CHnMdItem* CHnMdItem::TakeAlternativeModeItem()
       
   141     {
       
   142     CHnMdItem * ret = iAlternativeModeItem;
       
   143     iAlternativeModeItem = NULL;
       
   144     return ret;
       
   145     }
       
   146 
       
   147 // ---------------------------------------------------------------------------
       
   148 //
       
   149 // ---------------------------------------------------------------------------
       
   150 //
       
   151 TBool CHnMdItem::HasAlternativeModeItem() const
       
   152     {
       
   153     return (iAlternativeModeItem != NULL) ? ETrue : EFalse;
       
   154     }
       
   155 
       
   156 // ---------------------------------------------------------------------------
       
   157 //
       
   158 // ---------------------------------------------------------------------------
       
   159 //
       
   160 void CHnMdItem::SetEditModeItemL( TXmlEngElement aElement )
       
   161     {
       
   162     RXmlEngNodeList< TXmlEngElement> children;
       
   163     CleanupClosePushL ( children );
       
   164     aElement.GetChildElements ( children );
       
   165 
       
   166     TInt count = children.Count();
       
   167     for (TInt j = 0; j < count ; j++ )
       
   168         {
       
   169         TXmlEngElement item = children.Next();
       
   170              
       
   171         if ( !item.Name().Compare( KEditModeItem8 ) )
       
   172             {
       
   173             iAlternativeModeItem = CHnMdItem::NewL( item, iCmnPtrs );
       
   174             iAlternativeModeItem->iItemId->UpdateL( *iItemId );
       
   175             break;
       
   176             }
       
   177         }
       
   178     CleanupStack::PopAndDestroy ( &children );
       
   179     }
       
   180 
       
   181 // ---------------------------------------------------------------------------
       
   182 //
       
   183 // ---------------------------------------------------------------------------
       
   184 //
       
   185 CHnMdItem* CHnMdItem::NewL(TXmlEngElement aElement,
       
   186                                         THnMdCommonPointers* aCmnPtrs)
       
   187     {
       
   188     CHnMdItem* self = CHnMdItem::NewLC(aElement, aCmnPtrs);
       
   189     CleanupStack::Pop( self );
       
   190     return self;
       
   191     }
       
   192 
       
   193 // ---------------------------------------------------------------------------
       
   194 //
       
   195 // ---------------------------------------------------------------------------
       
   196 //
       
   197 CHnMdItem* CHnMdItem::NewLC(TXmlEngElement aElement,
       
   198                                          THnMdCommonPointers* aCmnPtrs)
       
   199     {
       
   200     CHnMdItem* self = new( ELeave ) CHnMdItem;
       
   201     CleanupStack::PushL( self );
       
   202     self->ConstructL(aElement, aCmnPtrs);
       
   203     return self;
       
   204     }
       
   205 
       
   206 // ---------------------------------------------------------------------------
       
   207 //
       
   208 // ---------------------------------------------------------------------------
       
   209 //
       
   210 CHnMdItem::CHnMdItem() : iAlternativeModeItem(NULL), iAllowableTemplate(NULL)
       
   211     {
       
   212     }
       
   213 
       
   214 // ---------------------------------------------------------------------------
       
   215 //
       
   216 // ---------------------------------------------------------------------------
       
   217 //
       
   218 CHnMdItem::~CHnMdItem()
       
   219     {
       
   220     if ( iNotifyRequests )
       
   221         {
       
   222         CLiwGenericParamList* empty = NULL;
       
   223         TRAP_IGNORE( iNotifyRequests->SendAllRequestsL( *empty, KLiwOptCancel ) );
       
   224         }
       
   225 
       
   226     delete iNotifyRequests;
       
   227     delete iAlternativeModeItem;
       
   228     delete iAllowableTemplate;
       
   229     iTemplate.Close();
       
   230     delete iMenu;
       
   231     delete iQueries;
       
   232     delete iEventMapping;
       
   233     delete iUiMapping;
       
   234     delete iItemId;
       
   235     delete iToolbar;
       
   236     iRemoveLocked8.Close();
       
   237     iRunning8.Close();
       
   238     iDrmProtection8.Close();
       
   239     iMoveLocked8.Close();
       
   240     iType8.Close();
       
   241     iUid8.Close();
       
   242     iCustomId8.Close();
       
   243     iCount8.Close();
       
   244     delete iQueriesResultsList;
       
   245     delete iQc;
       
   246     delete iCondition;
       
   247     delete iMsk;
       
   248     }
       
   249 
       
   250 // ---------------------------------------------------------------------------
       
   251 //
       
   252 // ---------------------------------------------------------------------------
       
   253 //
       
   254 void CHnMdItem::EvaluateItemItselfL(CHnSuiteModel & aSuiteModel,
       
   255         CLiwGenericParamList& aParams, TInt aItemPosition )
       
   256     {
       
   257     
       
   258     DEBUG16(("_MM_: CHnMdItem::EvaluateItemL IN"));
       
   259     iSuiteModel = &aSuiteModel;
       
   260    
       
   261     if ( !iNotifyRequests->Sent() )
       
   262     	{
       
   263     	iNotifyRequests->SendAllRequestsL( aParams );
       
   264     	}
       
   265     
       
   266     iItemPosition = aItemPosition;
       
   267     
       
   268     //allocate memory for new results
       
   269     iQueriesResultsList->Reset();
       
   270     iQueriesResultsList->AppendL( aParams );
       
   271 
       
   272     //delete old query collector and create new one
       
   273     //currently running evaluations will be cancelled
       
   274     delete iQc;
       
   275     iQc = NULL;
       
   276     iQc = CHnQueryResultCollector::NewL( *iQueries , aParams );
       
   277     iQc->StartAsynchL( this );
       
   278     }
       
   279 
       
   280 // ---------------------------------------------------------------------------
       
   281 //
       
   282 // ---------------------------------------------------------------------------
       
   283 //
       
   284 TInt CHnMdItem::AddItemL( CHnSuiteModel& aSuiteModel, TInt aItemId, 
       
   285         const CLiwGenericParamList& aQueriesResultsList, TInt aItemModelNumber, 
       
   286         TInt aItemPos )
       
   287 	{
       
   288 	TInt err( KErrNone );
       
   289 	CHnItemModel* itemModel = CHnItemModel::NewL();
       
   290 	CleanupStack::PushL( itemModel );
       
   291 	
       
   292 	TBool result = FillItemModelL( itemModel, aQueriesResultsList, aItemPos );
       
   293 	
       
   294 	if ( result )
       
   295 		{
       
   296 		if ( !itemModel->GetTemplate().Compare( KTemplateEmpty8 ) )
       
   297 			{
       
   298 			CHnItemModel* empty = aSuiteModel.GetItemModel( aSuiteModel.IdByIndex( -1 ) );
       
   299 			// empty has been already added
       
   300 			if ( empty )
       
   301 				{
       
   302 				err = KErrAlreadyExists;
       
   303 				}
       
   304 			}
       
   305 		}
       
   306 	else
       
   307 		{
       
   308 		err = KErrGeneral;
       
   309 		}
       
   310 	
       
   311 	if( KErrNone == err )
       
   312 		{
       
   313 		aSuiteModel.AddItemL( aItemId, itemModel, aItemModelNumber, aItemPos );
       
   314 		CleanupStack::Pop( itemModel );
       
   315 	    }
       
   316 	else
       
   317 		{
       
   318 		CleanupStack::PopAndDestroy( itemModel );
       
   319 		itemModel = NULL;
       
   320 		}
       
   321 	return err;
       
   322 	}
       
   323 
       
   324 // ---------------------------------------------------------------------------
       
   325 //
       
   326 // ---------------------------------------------------------------------------
       
   327 //
       
   328 TInt CHnMdItem::UpdateItemL( CHnSuiteModel & aSuiteModel, TInt aItemId,
       
   329 		const CLiwGenericParamList& aQueriesResultsList, TInt aItemPos )
       
   330 	{
       
   331 	TBool result = ETrue;
       
   332 	CHnItemModel* itemModel = aSuiteModel.GetItemModel( aItemId );
       
   333 	itemModel->ClearAttributesL();
       
   334 	result = FillItemModelL( itemModel, aQueriesResultsList, aItemPos );
       
   335 	if( result )
       
   336 		{
       
   337 		aSuiteModel.UpdateItemTemplateL( aItemId );
       
   338 		}  
       
   339 	return result ? KErrNone : KErrGeneral;
       
   340 	}
       
   341 
       
   342 // ---------------------------------------------------------------------------
       
   343 //
       
   344 // ---------------------------------------------------------------------------
       
   345 //
       
   346 void CHnMdItem::RemoveItemL( CHnSuiteModel & aSuiteModel, TInt aId )
       
   347 	{
       
   348 	//TInt id = iIds[ aPosition ];
       
   349 	//iIds.Remove( aPosition );
       
   350 	aSuiteModel.RemoveItemL( aId );
       
   351 	}
       
   352 
       
   353 // ---------------------------------------------------------------------------
       
   354 //
       
   355 // ---------------------------------------------------------------------------
       
   356 //
       
   357 void CHnMdItem::EvaluateItemL( CHnSuiteModel & aSuiteModel,
       
   358                                CLiwGenericParamList& aParamList, 
       
   359                                TInt aItemPosition )
       
   360     {
       
   361     if( iEvaluationNeeded  )
       
   362         {
       
   363         EvaluateItemItselfL( aSuiteModel, aParamList, aItemPosition );
       
   364         iEvaluationNeeded = EFalse;
       
   365         }
       
   366     }
       
   367 
       
   368 // ---------------------------------------------------------------------------
       
   369 //
       
   370 // ---------------------------------------------------------------------------
       
   371 //
       
   372 void CHnMdItem::MarkEvaluationL( CHnFilter& aFilter )
       
   373     {
       
   374     if( aFilter.HasItemIds() )
       
   375         {
       
   376         aFilter.ResetIterator();
       
   377         while( aFilter.HasNextItemId() && !iEvaluationNeeded )
       
   378             {
       
   379             const CHnItemId* item = aFilter.GetNextItemId();
       
   380             if( iItemId->Compare( *item ) )
       
   381                 {
       
   382                 iEvaluationNeeded = ETrue;
       
   383                 }
       
   384             }
       
   385         }
       
   386      else
       
   387         {
       
   388         iEvaluationNeeded = ETrue;
       
   389         }
       
   390     }
       
   391 
       
   392 // ---------------------------------------------------------------------------
       
   393 //
       
   394 // ---------------------------------------------------------------------------
       
   395 //
       
   396 TInt CHnMdItem::EvaluateItemL( CHnSuiteModel & aSuiteModel,
       
   397         const CHnItemId* aItemId, CLiwGenericParamList& aParamList, 
       
   398         TInt aItemPosition )
       
   399     {
       
   400     DEBUG(("_MM_: CHnMdItem::EvaluateItemL IN")); //TO CHANGE LATER (id : %S)", iItemId->Id()));
       
   401     TInt result( KErrNotFound ); 
       
   402     if( iItemId->Compare( *aItemId ) )
       
   403         {
       
   404         EvaluateItemItselfL( aSuiteModel, aParamList, aItemPosition );
       
   405         result = KErrNone;
       
   406         }
       
   407     DEBUG(("_MM_: CHnMdItem::EvaluateItemL OUT"));
       
   408     return result;
       
   409     }
       
   410 
       
   411 // ---------------------------------------------------------------------------
       
   412 //
       
   413 // ---------------------------------------------------------------------------
       
   414 //
       
   415 TInt CHnMdItem::GetIndexValuesFromOutputsL( RPointerArray < HBufC8 > &aValues,
       
   416         TXmlEngElement aElement )
       
   417 	{
       
   418 	RXmlEngNodeList < TXmlEngElement > children;
       
   419 	CleanupClosePushL( children );
       
   420 	aElement.GetChildElements( children );
       
   421 	TInt amount = children.Count();
       
   422 	
       
   423 	TPtrC8 n = aElement.Name();
       
   424 
       
   425 	for( TInt j( 0 ); j < amount; j++ )
       
   426 		{
       
   427 		TXmlEngElement item = children.Next();
       
   428 		
       
   429 		if ( !item.Name().Compare( KOutputElementItem8 ) )
       
   430 			{
       
   431 			if ( item.HasAttributeL( KValueAttrName8 ) &&
       
   432 				 item.AttributeValueL( KValueAttrName8 ).Find( KIndex8 ) >= 0 &&
       
   433 				 item.HasAttributeL( KAliasAttrName8 ) &&
       
   434 				!item.AttributeValueL( KAliasAttrName8 ).Compare( KTitle8 ) )
       
   435 				{
       
   436 				TInt pos = item.AttributeValueL( KValueAttrName8 ).Find( KIndexWithBrackets8 ) - 1;
       
   437 				TInt siz = KCount().Length();
       
   438 				TInt len = pos + siz;
       
   439 				TInt len0 = item.AttributeValueL( KValueAttrName8 ).Length() + KCount().Length();
       
   440 				
       
   441 				HBufC8* buf = HBufC8::NewL( len0 );
       
   442 				buf->Des().Copy( item.AttributeValueL( KValueAttrName8 ) );
       
   443 				buf->Des().Replace( pos, siz, KCount() );
       
   444 				buf->Des().SetLength( len );
       
   445 				aValues.Append( buf );
       
   446 				}
       
   447 			}
       
   448 		}
       
   449 	
       
   450 	CleanupStack::PopAndDestroy( &children );
       
   451 	return aValues.Count();
       
   452 	}
       
   453         
       
   454 // ---------------------------------------------------------------------------
       
   455 //
       
   456 // ---------------------------------------------------------------------------
       
   457 //
       
   458 void CHnMdItem::SetCountL( TXmlEngElement aElement )
       
   459     {
       
   460     TXmlEngAttr aAttr = aElement.AttributeNodeL( KCountAttrName8 );
       
   461     iCount8.Close();
       
   462     iCount8.CreateL( aAttr.Value() );
       
   463     
       
   464     // replace "*"
       
   465     if ( !iCount8.Compare( KStar8 ) )
       
   466     	{
       
   467     	RPointerArray<HBufC8> values;
       
   468     	CleanupClosePushL( values );
       
   469     	if( GetIndexValuesFromOutputsL( values, aElement ) > 0 )
       
   470     	    {
       
   471             for( TInt i = 0; i < values.Count(); i++ )
       
   472                 {
       
   473                 HBufC8* buf = values[i];
       
   474                 iCount8.Close();
       
   475                 iCount8.CreateL( buf->Length() );
       
   476                 iCount8.Copy( *buf );
       
   477                 }
       
   478     	    }
       
   479     	else
       
   480     	    {
       
   481             iCount8.Close();
       
   482             iCount8.CreateL( KDefaultCount8().Length() );
       
   483             iCount8.Copy( KDefaultCount8 );
       
   484     	    }
       
   485     	values.ResetAndDestroy();
       
   486     	CleanupStack::PopAndDestroy( &values );
       
   487     	}
       
   488     }
       
   489 
       
   490 // ---------------------------------------------------------------------------
       
   491 //
       
   492 // ---------------------------------------------------------------------------
       
   493 //
       
   494 void CHnMdItem::SetTemplateL( TXmlEngAttr aAttr )
       
   495     {
       
   496     iAllowableTemplate = new ( ELeave ) CDesC8ArrayFlat( 3 );
       
   497        
       
   498     for (int i = 0; i < HnUtils::GetColumnTextColumnCount(aAttr.Value()); i++)
       
   499         {
       
   500         HBufC8* templateBuf = HnUtils::GetColumnTextLC( i, aAttr.Value() );
       
   501         templateBuf->Des().Trim();
       
   502         iAllowableTemplate->AppendL( *templateBuf );
       
   503         CleanupStack::PopAndDestroy(templateBuf);
       
   504         }
       
   505       
       
   506     if (iAllowableTemplate->Count() > 0 )
       
   507         {
       
   508         const TDesC8 & val = (*iAllowableTemplate)[0];
       
   509         iTemplate.Close();
       
   510         iTemplate.CreateL( val.Length() + 1 );
       
   511         iTemplate.Copy( val );
       
   512         }
       
   513     else
       
   514         iTemplate.CreateL( KNullDesC8() );
       
   515     }
       
   516 
       
   517 // ---------------------------------------------------------------------------
       
   518 //
       
   519 // ---------------------------------------------------------------------------
       
   520 //
       
   521 void CHnMdItem::SetTemplateL( CHnItemModel* aItemModel )
       
   522     {
       
   523     ASSERT( aItemModel );
       
   524     CHnAttributeText* templateAttr = CHnAttributeText::NewL();
       
   525     templateAttr->SetNameL( KTemplate8 );
       
   526     templateAttr->SetValueL( iTemplate );
       
   527     aItemModel->SetAttributeL( templateAttr );
       
   528     }
       
   529 
       
   530 // ---------------------------------------------------------------------------
       
   531 //
       
   532 // ---------------------------------------------------------------------------
       
   533 //
       
   534 void CHnMdItem::SetAlternativeTemplateL( TInt aOption )
       
   535     {
       
   536     if ( !iTemplate.Compare( KTemplateEmpty8 ) )
       
   537         {
       
   538         return;
       
   539         }
       
   540     iTemplate.Close();
       
   541     if (aOption >=0 && aOption < iAllowableTemplate->Count())
       
   542         {
       
   543         const TDesC8 & val = (*iAllowableTemplate)[aOption];
       
   544         iTemplate.CreateL( val.Length() + 1 );
       
   545         iTemplate.Copy( val );
       
   546         }
       
   547     else
       
   548         {
       
   549         iTemplate.CreateL( KNullDesC8() );
       
   550         }
       
   551     }
       
   552 
       
   553 // ---------------------------------------------------------------------------
       
   554 //
       
   555 // ---------------------------------------------------------------------------
       
   556 //
       
   557 void CHnMdItem::SetItemIdL( TXmlEngElement aItemElement )
       
   558     {
       
   559     HBufC* suiteName = HnConvUtils::Str8ToStrLC(
       
   560         aItemElement.AttributeNodeL( KSuiteElementName8 ).Value() );
       
   561     HBufC* itemId = HnConvUtils::Str8ToStrLC(
       
   562         aItemElement.AttributeNodeL( KItemIdAttrName8 ).Value() );
       
   563 
       
   564     iItemId = CHnItemId::NewL( *suiteName, *itemId );
       
   565 
       
   566     CleanupStack::PopAndDestroy( itemId );
       
   567     CleanupStack::PopAndDestroy( suiteName );
       
   568     }
       
   569 
       
   570 // ---------------------------------------------------------------------------
       
   571 //
       
   572 // ---------------------------------------------------------------------------
       
   573 //
       
   574 void CHnMdItem::SetDeleteMoveAttributesL( CHnItemModel* aItemModel, 
       
   575 		const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   576 	{
       
   577 	aItemModel->ClearFlags();
       
   578 	TLiwVariant moveLocked;
       
   579 	moveLocked.PushL();
       
   580 	HnLiwUtils::GetVariantL( aQueriesResultsList, iMoveLocked8, aPos, moveLocked );
       
   581     if ( moveLocked == TLiwVariant( (TBool) ETrue ) ) 
       
   582     	{
       
   583     	aItemModel->SetFlag( EItemFlagMoveLocked );
       
   584     	}
       
   585     CleanupStack::PopAndDestroy( &moveLocked );
       
   586     
       
   587     TLiwVariant deleteLocked;
       
   588     deleteLocked.PushL();
       
   589     HnLiwUtils::GetVariantL( aQueriesResultsList, iRemoveLocked8, aPos, deleteLocked );
       
   590     if ( deleteLocked == TLiwVariant( (TBool) ETrue ) )
       
   591     	{
       
   592     	aItemModel->SetFlag( EItemFlagRemoveLocked );
       
   593     	}
       
   594     CleanupStack::PopAndDestroy( &deleteLocked );
       
   595     
       
   596     TLiwVariant running;
       
   597     running.PushL();
       
   598     HnLiwUtils::GetVariantL( aQueriesResultsList, iRunning8, aPos, running );
       
   599     if ( running == TLiwVariant( (TBool) ETrue ) )
       
   600     	{
       
   601     	aItemModel->SetFlag( EItemFlagRunning );
       
   602     	}
       
   603     CleanupStack::PopAndDestroy( &running );
       
   604     
       
   605     TLiwVariant drm;
       
   606     drm.PushL();
       
   607     HnLiwUtils::GetVariantL( aQueriesResultsList, iDrmProtection8, aPos, drm );
       
   608     TPtrC drmRights;
       
   609     drm.Get( drmRights );
       
   610     if ( !drmRights.Compare( KMenuDrmRightsExpired ) )
       
   611         {
       
   612         aItemModel->SetFlag( EItemFlagDrmExpired );
       
   613         }
       
   614     CleanupStack::PopAndDestroy( &drm );
       
   615 	}
       
   616 
       
   617 
       
   618 // ---------------------------------------------------------------------------
       
   619 //
       
   620 // ---------------------------------------------------------------------------
       
   621 //
       
   622 void CHnMdItem::SetTypeL( CHnItemModel* aItemModel, 
       
   623 		const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   624 	{
       
   625 	RBuf8 type;
       
   626     CleanupClosePushL( type );
       
   627     HnLiwUtils::GetStringL( aQueriesResultsList, iType8, aPos, type );
       
   628     aItemModel->SetType( type );
       
   629     CleanupStack::PopAndDestroy( &type );
       
   630 	}
       
   631 
       
   632 // ---------------------------------------------------------------------------
       
   633 //
       
   634 // ---------------------------------------------------------------------------
       
   635 //
       
   636 void CHnMdItem::SetUidL( CHnItemModel* aItemModel, 
       
   637         const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   638     {
       
   639     RBuf8 uid;
       
   640     CleanupClosePushL( uid );
       
   641     HnLiwUtils::GetStringL( aQueriesResultsList, iUid8, aPos, uid );
       
   642     aItemModel->SetItemUidL( uid );
       
   643     CleanupStack::PopAndDestroy( &uid );
       
   644     }
       
   645 
       
   646 // ---------------------------------------------------------------------------
       
   647 //
       
   648 // ---------------------------------------------------------------------------
       
   649 //
       
   650 void CHnMdItem::SetCustomIdL( CHnItemModel* aItemModel, 
       
   651 		const CLiwGenericParamList& aParams, TInt aPos )
       
   652 	{
       
   653 	TInt64 customId( KErrNotFound );
       
   654 	if ( KErrNone == HnLiwUtils::GetInt64L(
       
   655 			aParams, iCustomId8, aPos, customId ) )
       
   656 		{
       
   657 		aItemModel->SetCustomId( customId );
       
   658 		}
       
   659 	}
       
   660 
       
   661 // ---------------------------------------------------------------------------
       
   662 //
       
   663 // ---------------------------------------------------------------------------
       
   664 //
       
   665 TBool CHnMdItem::FillItemModelL( CHnItemModel* aItemModel, 
       
   666 		const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   667 	{
       
   668 	TBool result( EFalse );
       
   669 	
       
   670 	// set template for item
       
   671 	SetTemplateL( aItemModel );
       
   672     
       
   673     // set delete/move locked attributes
       
   674 	SetDeleteMoveAttributesL( aItemModel, aQueriesResultsList, aPos );
       
   675 
       
   676     // set type of an item    
       
   677 	SetTypeL( aItemModel, aQueriesResultsList, aPos );
       
   678 	
       
   679     // set uid of an item    
       
   680     SetUidL( aItemModel, aQueriesResultsList, aPos );
       
   681 	
       
   682 	// set custom id
       
   683     SetCustomIdL( aItemModel, aQueriesResultsList, aPos );
       
   684     
       
   685     // fills mul item	
       
   686 	TRAP_IGNORE( result = iUiMapping->FillGraphicalItemL( 
       
   687 	        aItemModel, aQueriesResultsList, aPos ) );
       
   688 	
       
   689 	if ( result )
       
   690 		{
       
   691 		// fills item model
       
   692 		FillItemModelWithMenuItemsL( aItemModel, aQueriesResultsList, aPos );
       
   693 		FillItemModelWithToolbarL( aItemModel, aQueriesResultsList, aPos );
       
   694 		FillItemModelWithMiddleSoftKeyL( aItemModel, aQueriesResultsList, 
       
   695 		        aPos );
       
   696 					
       
   697 		aItemModel->DeleteAllActionModels();
       
   698 		iEventMapping->FillActionsL( aItemModel->GetActions(), 
       
   699 		        aQueriesResultsList, aPos );
       
   700 		}
       
   701 	return result;
       
   702     } 
       
   703 
       
   704 // ---------------------------------------------------------------------------
       
   705 // 
       
   706 // ---------------------------------------------------------------------------
       
   707 //
       
   708 void CHnMdItem::FillItemModelWithMenuItemsL( CHnItemModel* aItemModel, 
       
   709         const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   710     {
       
   711     CHnMenuItemModel* menu = CHnMenuItemModel::NewL( KMenuItemName() );
       
   712     CleanupStack::PushL( menu );
       
   713     iMenu->EvaluateL( menu, aQueriesResultsList, aPos );
       
   714     aItemModel->SetMenuItemModel( menu );
       
   715     CleanupStack::Pop( menu );
       
   716     }
       
   717 
       
   718 // ---------------------------------------------------------------------------
       
   719 // 
       
   720 // ---------------------------------------------------------------------------
       
   721 //
       
   722 void CHnMdItem::FillItemModelWithToolbarL( CHnItemModel* aItemModel, 
       
   723         const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   724     {
       
   725     CHnToolbarModel* toolbar = CHnToolbarModel::NewLC();
       
   726     iToolbar->EvaluateL( toolbar, aQueriesResultsList, aPos );
       
   727     aItemModel->SetToolbarModel( toolbar );
       
   728     CleanupStack::Pop( toolbar );
       
   729     }
       
   730 
       
   731 // ---------------------------------------------------------------------------
       
   732 // 
       
   733 // ---------------------------------------------------------------------------
       
   734 //
       
   735 void CHnMdItem::FillItemModelWithMiddleSoftKeyL( CHnItemModel* aItemModel, 
       
   736         const CLiwGenericParamList& aQueriesResultsList, TInt aPos )
       
   737     {
       
   738     if ( iMsk )
       
   739         {
       
   740         CHnButtonModel* msk = CHnButtonModel::NewLC( iMsk->GetIndex() );
       
   741     	const TDesC& helpText = iMsk->EvaluateButtonTextL( 
       
   742                 aQueriesResultsList, aPos );
       
   743         msk->SetHelpTextL( helpText );
       
   744         aItemModel->SetMiddleSoftKey( msk );
       
   745         CleanupStack::Pop( msk );
       
   746         }
       
   747     }
       
   748 
       
   749 // ---------------------------------------------------------------------------
       
   750 // 
       
   751 // ---------------------------------------------------------------------------
       
   752 //
       
   753 TBool CHnMdItem::IsValidL( const CLiwGenericParamList& aQueryResults, 
       
   754                   TInt aPos )    
       
   755     {
       
   756     TBool ret( EFalse );
       
   757     if( !iCondition || iCondition->ResultL( aQueryResults, aPos ) )
       
   758         {
       
   759         ret = ETrue;
       
   760         }
       
   761     return ret;
       
   762     }
       
   763 
       
   764 // ---------------------------------------------------------------------------
       
   765 //
       
   766 // ---------------------------------------------------------------------------
       
   767 //
       
   768 
       
   769 TBool CHnMdItem::CompareItems( CHnItemId* aSearchCriteria )
       
   770     {
       
   771     return iItemId->Compare( *aSearchCriteria );
       
   772     }
       
   773 
       
   774 // ---------------------------------------------------------------------------
       
   775 //
       
   776 // ---------------------------------------------------------------------------
       
   777 //
       
   778 void CHnMdItem::SetAttributesL( TXmlEngElement aElement )
       
   779     {
       
   780     iMoveLocked8.Close();
       
   781     iRemoveLocked8.Close();
       
   782     iRunning8.Close();
       
   783     iDrmProtection8.Close();
       
   784     
       
   785     if ( aElement.HasAttributeL( KMoveLocked8 ) )
       
   786     	{
       
   787     	TPtrC8 av = aElement.AttributeValueL( KMoveLocked8 );
       
   788     	iMoveLocked8.CreateL( av );
       
   789     	}
       
   790     else
       
   791     	{
       
   792     	iMoveLocked8.CreateL( KStringFalse8 );
       
   793     	}
       
   794     
       
   795     if ( aElement.HasAttributeL( KRemoveLocked8 ) )
       
   796     	{
       
   797     	TPtrC8 av = aElement.AttributeValueL( KRemoveLocked8 );
       
   798     	iRemoveLocked8.CreateL( av );
       
   799     	}
       
   800     else
       
   801     	{
       
   802     	iRemoveLocked8.CreateL( KStringFalse8 );
       
   803     	}
       
   804     
       
   805     if ( aElement.HasAttributeL( KRunning8 ) )
       
   806     	{
       
   807     	TPtrC8 av = aElement.AttributeValueL( KRunning8 );
       
   808     	iRunning8.CreateL( av );
       
   809     	}
       
   810     else
       
   811     	{
       
   812     	iRunning8.CreateL( KStringFalse8 );
       
   813     	}
       
   814     
       
   815     if ( aElement.HasAttributeL( KDrmProtection8 ) )
       
   816         {
       
   817         TPtrC8 av = aElement.AttributeValueL( KDrmProtection8 );
       
   818         iDrmProtection8.CreateL( av );
       
   819         }
       
   820     else
       
   821         {
       
   822         iDrmProtection8.CreateL( KMenuDrmUnknown8 );
       
   823         }
       
   824     }
       
   825 
       
   826 // ---------------------------------------------------------------------------
       
   827 //
       
   828 // ---------------------------------------------------------------------------
       
   829 //
       
   830 void CHnMdItem::SetTypeL( TXmlEngElement aElement )
       
   831     {
       
   832     iType8.Close();
       
   833     
       
   834     if ( aElement.HasAttributeL( KItemType8 ) )
       
   835     	{
       
   836     	TPtrC8 av = aElement.AttributeValueL( KItemType8 );
       
   837     	iType8.CreateL( av );
       
   838     	}
       
   839     else
       
   840     	{
       
   841     	iType8.CreateL( KItemTypeUnknown8 );
       
   842     	}
       
   843     }
       
   844 
       
   845 // ---------------------------------------------------------------------------
       
   846 //
       
   847 // ---------------------------------------------------------------------------
       
   848 //
       
   849 void CHnMdItem::SetUidL( TXmlEngElement aElement )
       
   850     {
       
   851     iUid8.Close();
       
   852     
       
   853     if ( aElement.HasAttributeL( KItemUid8 ) )
       
   854         {
       
   855         TPtrC8 av = aElement.AttributeValueL( KItemUid8 );
       
   856         iUid8.CreateL( av );
       
   857         }
       
   858     else
       
   859         {
       
   860         iUid8.CreateL( TUid::Null().Name().Length() );
       
   861         iUid8.Append( TUid::Null().Name() );
       
   862         }
       
   863     }
       
   864 
       
   865 // ---------------------------------------------------------------------------
       
   866 //
       
   867 // ---------------------------------------------------------------------------
       
   868 //
       
   869 void CHnMdItem::SetCustomIdL( TXmlEngElement aElement )
       
   870     {
       
   871     iCustomId8.Close();
       
   872     
       
   873     if ( aElement.HasAttributeL( KCustomId8 ) )
       
   874     	{
       
   875     	TPtrC8 av = aElement.AttributeValueL( KCustomId8 );
       
   876     	iCustomId8.CreateL( av );
       
   877     	}
       
   878     else
       
   879     	{
       
   880     	iCustomId8.CreateL( KItemTypeUnknown8 );
       
   881     	}
       
   882     }
       
   883 
       
   884 // ---------------------------------------------------------------------------
       
   885 //
       
   886 // ---------------------------------------------------------------------------
       
   887 //
       
   888 void CHnMdItem::SetMiddleSoftKeyL( TXmlEngElement aElement, 
       
   889         THnMdCommonPointers* aCmnPtrs )
       
   890     {
       
   891     RXmlEngNodeList< TXmlEngElement> children;
       
   892     CleanupClosePushL ( children );
       
   893     aElement.GetChildElements ( children );
       
   894     TInt count = children.Count();
       
   895     for (TInt i = 0; i < count; i++ )
       
   896         {
       
   897         TXmlEngElement item = children.Next();
       
   898              
       
   899         if ( !item.Name().Compare( KMiddleSoftKey8 ) )
       
   900             {
       
   901             iMsk = CHnMdButton::NewLC( item, aCmnPtrs );
       
   902             CleanupStack::Pop( iMsk );
       
   903             break;
       
   904             }
       
   905         }
       
   906     CleanupStack::PopAndDestroy( &children );
       
   907     }
       
   908 
       
   909 // ---------------------------------------------------------------------------
       
   910 //
       
   911 // ---------------------------------------------------------------------------
       
   912 //
       
   913 EXPORT_C TDesC8& CHnMdItem::Template()
       
   914 	{
       
   915 	return iTemplate;
       
   916 	}
       
   917 
       
   918 // ---------------------------------------------------------------------------
       
   919 //
       
   920 // ---------------------------------------------------------------------------
       
   921 //
       
   922 EXPORT_C TDesC8& CHnMdItem::Type()
       
   923 	{
       
   924 	return iType8;
       
   925 	}
       
   926 
       
   927 // ---------------------------------------------------------------------------
       
   928 //
       
   929 // ---------------------------------------------------------------------------
       
   930 //
       
   931 EXPORT_C TDesC8& CHnMdItem::Uid()
       
   932     {
       
   933     return iUid8;
       
   934     }
       
   935 
       
   936 // ---------------------------------------------------------------------------
       
   937 //
       
   938 // ---------------------------------------------------------------------------
       
   939 //
       
   940 TInt CHnMdItem::GetItemsMaxCountL()
       
   941     {
       
   942     TInt ret( KErrNotFound );
       
   943     
       
   944     // check if iCount8 equals "*"
       
   945     if ( !iCount8.Compare( KStar8() ) )
       
   946     	{
       
   947     	ret = KErrUnknown;
       
   948     	}
       
   949     // check if iCount8 is a number
       
   950     else if ( HnConvUtils::Str8ToInt( iCount8, ret ) >= 0 ) 
       
   951     	{
       
   952     	; // ret contains a number
       
   953     	}
       
   954     // try to retrieve number of items from given paths
       
   955     else
       
   956 		{
       
   957 		TInt columnsCount( HnUtils::GetColumnTextColumnCount( iCount8 ) );
       
   958 		for (int i = 0; i < columnsCount; i++)
       
   959 			{
       
   960 			HBufC8* tmpCountBuf = HnUtils::GetColumnTextLC( i, iCount8 );
       
   961 			TInt pos = tmpCountBuf->Des().Find( KCount() );
       
   962 			
       
   963 			if ( pos >= 0 )
       
   964 				{
       
   965 				tmpCountBuf->Des().Replace( pos, KCount().Length(), KNullDesC8 );
       
   966 				TLiwVariant variant;
       
   967 				variant.PushL();
       
   968 				HnLiwUtils::GetVariantL( *iQueriesResultsList, *tmpCountBuf, variant );
       
   969 
       
   970 				const CLiwList* list = variant.AsList();
       
   971 				CLiwIterable* iterable = variant.AsIterable();
       
   972 				TInt count = KErrNotFound;
       
   973 				if ( list )
       
   974 				    {
       
   975 				    count = list->Count();
       
   976 				    }
       
   977 				else if ( iterable )
       
   978 				    {
       
   979 				    count = HnLiwUtils::GetIterableItemCountL( *iterable );
       
   980 				    }
       
   981 
       
   982 				if ( count != KErrNotFound )
       
   983 					{
       
   984 					if ( ( i == 0 ) || ( ( i > 0 ) && ( count < ret )  ) )
       
   985 						{
       
   986 						ret = count;
       
   987 						}
       
   988 					}
       
   989 				CleanupStack::PopAndDestroy( &variant );
       
   990 				}
       
   991 	
       
   992 			CleanupStack::PopAndDestroy( tmpCountBuf );
       
   993 			}
       
   994 		}
       
   995    
       
   996     return ret; 
       
   997     }
       
   998 
       
   999 // ---------------------------------------------------------------------------
       
  1000 //
       
  1001 // ---------------------------------------------------------------------------
       
  1002 //
       
  1003 void CHnMdItem::ResultsCollectedL( CLiwGenericParamList* aResults )
       
  1004     {
       
  1005     iQueriesResultsList->AppendL( *aResults );
       
  1006 
       
  1007     RArray< TInt > ids;
       
  1008     CleanupClosePushL( ids );
       
  1009     iSuiteModel->GetItemsOrder()->GetIdsForL( iItemPosition, ids );
       
  1010     TInt startCount = ids.Count();
       
  1011     TInt visibleItemsBeforeEvaluation = iSuiteModel->GetItemsOrder()->Count();
       
  1012     TInt id( 0 );
       
  1013 
       
  1014     TBool result = ETrue;
       
  1015     TInt itemCounter = 0;
       
  1016     
       
  1017     TInt maxCount( GetItemsMaxCountL() );
       
  1018     
       
  1019     for ( TInt i(0); result; i++, itemCounter++)
       
  1020         {
       
  1021         result = ( maxCount != KErrUnknown ) ? i < maxCount && result : result;
       
  1022         
       
  1023         if ( !result )
       
  1024             {
       
  1025             continue;
       
  1026             }
       
  1027        
       
  1028         id = (ids.Count() > 0 && i < ids.Count()) ? ids[itemCounter]
       
  1029 				: KErrNotFound;
       
  1030         
       
  1031         if( id == KErrNotFound )
       
  1032         	{
       
  1033         	id = iCmnPtrs->iIdGenerator->GetNextId();
       
  1034         	TInt err = AddItemL( *iSuiteModel, id, *iQueriesResultsList,
       
  1035         	        iItemPosition, itemCounter );
       
  1036         	if ( KErrAlreadyExists == err )
       
  1037         		{
       
  1038         		// update empty item which is identified by "-1"
       
  1039         		TInt err = UpdateItemL( *iSuiteModel, iSuiteModel->IdByIndex(-1), *iQueriesResultsList, i );
       
  1040         		result = ( KErrNone == err ) ? ETrue : EFalse;
       
  1041         		}
       
  1042         	else if ( KErrNone != err )
       
  1043         		{
       
  1044         		result = EFalse;
       
  1045         		}
       
  1046         	}
       
  1047         else
       
  1048         	{
       
  1049            	TInt err = UpdateItemL( *iSuiteModel, id, *iQueriesResultsList, i );
       
  1050            	result = ( KErrNone == err ) ? ETrue : EFalse;
       
  1051         	}
       
  1052         
       
  1053         if ( !IsValidL( *iQueriesResultsList, i ) )
       
  1054             {
       
  1055             RemoveItemL( *iSuiteModel, id );
       
  1056             itemCounter--;
       
  1057             continue;
       
  1058             }
       
  1059         }
       
  1060     
       
  1061     for( TInt it(startCount - 1); it >= itemCounter -1 && it >= 0; it-- )
       
  1062     	{
       
  1063     	RemoveItemL( *iSuiteModel, ids[it] );
       
  1064     	}
       
  1065     
       
  1066     CleanupStack::PopAndDestroy( &ids );    
       
  1067     iSuiteModel->RefreshMulModelL( visibleItemsBeforeEvaluation );
       
  1068     TBool observersNotified = 
       
  1069 		iSuiteModel->ItemEvaluationFinishedL( iItemPosition );
       
  1070     if ( observersNotified )
       
  1071     	{
       
  1072     	iCmnPtrs->iModel->SuiteModelReadyToShowL( iSuiteModel );
       
  1073     	}
       
  1074     
       
  1075     DEBUG(("_MM_: CHnMdItem::ResultsCollectedL OUT"));
       
  1076     }
       
  1077 
       
  1078 // End of file