--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/menufw/hierarchynavigator/hnmetadatamodel/src/hnrepositoryobserver.cpp Wed Sep 01 12:32:46 2010 +0100
@@ -0,0 +1,805 @@
+/*
+* Copyright (c) 2002-2004 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: factory settings for active space
+*
+*/
+
+
+#include <centralrepository.h>
+#include <menudebug.h>
+#include <apadef.h>
+#include <AknDef.hrh>
+#include "hnrepositoryobserver.h"
+#include "hnglobals.h"
+#include "hnsuitemodelcontainer.h"
+#include "hnsuitemodel.h"
+#include "hnmdsuite.h"
+#include "hnitemsorder.h"
+#include "hnliwutils.h"
+#include "hnmdbasekey.h"
+#include "hnmdkeyfactory.h"
+#include "hnconvutils.h"
+#include "hnsuiteobserver.h"
+#include "hnmdmodel.h"
+
+class CHnServiceHandler;
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryObserver::ConstructL( const TUid aRepositoryUid )
+ {
+ iRepository = CRepository::NewL( aRepositoryUid );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryObserver::CHnRepositoryObserver( THnMdCommonPointers* aCmnPtrs )
+ : iCmnPtrs(aCmnPtrs)
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryObserver::CHnRepositoryObserver( THnMdCommonPointers* aCmnPtrs, TUint32 aId )
+: iId( aId ), iCmnPtrs(aCmnPtrs)
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryObserver::~CHnRepositoryObserver()
+ {
+ if (iNotifyHandler)
+ iNotifyHandler->StopListening();
+ delete iNotifyHandler;
+ delete iRepository;
+ }
+
+
+// class CHnRepositoryWidgetTypeObserver
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryWidgetTypeObserver * CHnRepositoryWidgetTypeObserver::NewL(
+ THnMdCommonPointers* aCmnPtrs, const TUid aRepositoryUid )
+ {
+ CHnRepositoryWidgetTypeObserver * self = CHnRepositoryWidgetTypeObserver::NewLC( aCmnPtrs, aRepositoryUid );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryWidgetTypeObserver * CHnRepositoryWidgetTypeObserver::NewLC(
+ THnMdCommonPointers* aCmnPtrs, const TUid aRepositoryUid )
+ {
+ CHnRepositoryWidgetTypeObserver * self = new (ELeave) CHnRepositoryWidgetTypeObserver( aCmnPtrs );
+ CleanupStack::PushL(self);
+ self->ConstructL( aRepositoryUid );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryWidgetTypeObserver::ConstructL( const TUid aRepositoryUid )
+ {
+ CHnRepositoryObserver::ConstructL( aRepositoryUid );
+ iNotifyHandler = CCenRepNotifyHandler::NewL(*this, *iRepository );
+ iNotifyHandler->StartListeningL();
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryWidgetTypeObserver::CHnRepositoryWidgetTypeObserver( THnMdCommonPointers* aCmnPtrs )
+ : CHnRepositoryObserver( aCmnPtrs )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryWidgetTypeObserver::~CHnRepositoryWidgetTypeObserver()
+ {
+ iWidgetSwitches.Close();
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryWidgetTypeObserver::HandleNotifyGeneric(TUint32 aId)
+ {
+ TRAP_IGNORE( HandleNotifyGenericL(aId) );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryWidgetTypeObserver::HandleNotifyGenericL(TUint32 aId)
+ {
+ DEBUG(("_MM_:CHnRepositoryObserver::HandleNotifyGeneric IN"));
+ DEBUG(("\tID: %d",aId));
+ THnSuiteWidgetType suiteState( EUnspecified );
+
+ iRepository->Get( aId, (int &) suiteState);
+ TInt id = iWidgetSwitches.Find(aId);
+
+ if ( suiteState == EChangeWidget )
+ {
+ iWidgetSwitches.AppendL(aId);
+ }
+ else if ( id != KErrNotFound )
+ {
+ iWidgetSwitches.Remove(id);
+ return;
+ }
+
+ CHnSuiteModel* lastSuiteModel = iCmnPtrs->iContainer->GetLastSuiteModel();
+ TBuf <NCentralRepositoryConstants::KMaxUnicodeStringLength> suiteName;
+ if ( iRepository->Get( aId - 1, suiteName ) == KErrNone && lastSuiteModel
+ && lastSuiteModel->WidgetType() != suiteState )
+ {
+ DEBUG16(("\t\tSuite Name: %S",&suiteName));
+ lastSuiteModel->GetItemsOrder()->MarkSuiteUninitialized();
+
+ TInt32 suiteId = lastSuiteModel->CustomId();
+
+ CLiwGenericParamList* inParam = CLiwGenericParamList::NewL();
+ CleanupStack::PushL( inParam );
+
+ CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+
+ map->InsertL( KGenreName8, TLiwVariant(suiteName) );
+ map->InsertL( KId8, TLiwVariant(suiteId) );
+ inParam->AppendL(TLiwGenericParam( KFilterElementItem8, TLiwVariant(map) ));
+ CleanupStack::PopAndDestroy( map );
+
+ iCmnPtrs->iModelEventObserver->HandleModelEventL( KReevaluateMdEvent, *inParam );
+
+ CleanupStack::PopAndDestroy( inParam );
+ }
+ DEBUG(("_MM_:CHnRepositoryObserver::HandleNotifyGeneric OUT"));
+ }
+
+
+// class CHnRepositoryShowFolderObserver
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryShowFolderObserver * CHnRepositoryShowFolderObserver::NewL(
+ THnMdCommonPointers* aCmnPtrs, const TUid aRepositoryUid, const TUint32 aId )
+ {
+ CHnRepositoryShowFolderObserver * self = CHnRepositoryShowFolderObserver::NewLC( aCmnPtrs, aRepositoryUid, aId );
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryShowFolderObserver * CHnRepositoryShowFolderObserver::NewLC(
+ THnMdCommonPointers* aCmnPtrs, const TUid aRepositoryUid, const TUint32 aId )
+ {
+ CHnRepositoryShowFolderObserver * self = new (ELeave) CHnRepositoryShowFolderObserver( aCmnPtrs, aId );
+ CleanupStack::PushL(self);
+ self->ConstructL( aRepositoryUid );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::ConstructL( const TUid aRepositoryUid )
+ {
+ CHnRepositoryObserver::ConstructL( aRepositoryUid );
+ TInt ret = iRepository->Create( iId, KBlank );
+ iNotifyHandler = CCenRepNotifyHandler::NewL(
+ *this, *iRepository,
+ CCenRepNotifyHandler::EStringKey, iId );
+ iNotifyHandler->StartListeningL();
+ }
+
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryShowFolderObserver::CHnRepositoryShowFolderObserver( THnMdCommonPointers* aCmnPtrs, TUint32 aId )
+ : CHnRepositoryObserver( aCmnPtrs, aId )
+ {
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+CHnRepositoryShowFolderObserver::~CHnRepositoryShowFolderObserver()
+ {
+ delete iServiceHandler;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::HandleNotifyString(TUint32 aId, const TDesC16& aNewValue )
+ {
+ TRAP_IGNORE( HandleNotifyStringL(aId, aNewValue) );
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::HandleNotifyStringL(TUint32 aId, const TDesC16& aNewValue)
+ {
+ DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyStringL IN"));
+ DEBUG(("\tID: %d : %S", aId, &aNewValue));
+
+ //++Show Folder
+ if( aId == iId && aNewValue.Length())
+ {
+ iNotifyType = 0;
+ ExtractCRKeyShowFolderName( aNewValue );
+
+ // iCRKeyFolderItemUid can contain mcs id or uid
+ // in case of uid it will be replaced whith id in HandleNotifyL callback
+ if( iCRKeyFolderItemUid.Length()>0 )
+ {
+ if( iCRKeyFolderItemUid.FindF( KHexPrefix8 )==0 )
+ {
+ iNotifyType |= EAPP_UID;
+ }
+ else
+ {
+ iNotifyType |= EAPP_ID;
+ }
+ }
+
+ CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
+ KInData8, KKeyTypeMap, KDefaultParentId8 );
+ CleanupStack::PushL( inDataKey );
+
+ CHnMdBaseKey* filter( NULL );
+ HBufC8* id( NULL );
+ if ( iCRKeyFolderName.Length()>0 && !( iNotifyType & EAPP_UID ) )
+ {
+ // app group name is known
+ // id is optional
+ id = HnConvUtils::NumToStr8LC( KRootId );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
+
+ filter = HnMdKeyFactory::CreateL(
+ KFilter8, KKeyTypeMap, KStringTrue8 );
+ CleanupStack::PushL( filter );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KMcsAppGroupName8, KKeyTypeString, iCRKeyFolderName ) );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
+ }
+ else if( iNotifyType & EAPP_ID )
+ {
+ // no app group name, id is known
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuApplication8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, iCRKeyFolderItemUid ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
+ }
+ else if( iNotifyType & EAPP_UID )
+ {
+ // uid is known
+ // app group name is optional
+ id = HnConvUtils::NumToStr8LC( KRootId );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
+
+ filter = HnMdKeyFactory::CreateL(
+ KFilter8, KKeyTypeMap, KStringTrue8 );
+ CleanupStack::PushL( filter );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KUid8, KKeyTypeInteger, iCRKeyFolderItemUid ) );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuApplication8 ) );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
+ }
+ else
+ {
+ // No app group name, no uid. Search for root.
+ id = HnConvUtils::NumToStr8LC( KRootId );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
+ }
+
+ RPointerArray< CHnMdBaseKey > data;
+ CleanupClosePushL( data );
+ data.AppendL( inDataKey );
+ if ( filter )
+ {
+ data.AppendL( filter );
+ }
+
+ CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL(
+ KServiceContentName, KKeyTypeString, KMatrixMenuData );
+ CleanupStack::PushL( serviceData );
+
+ RPointerArray< CHnMdBaseKey> constructor;
+ CleanupClosePushL( constructor );
+ constructor.AppendL( serviceData );
+ CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC();
+ CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC();
+ HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw );
+ HnLiwUtils::SetGenericParamListL( data, *commandLiw );
+
+ TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 );
+
+ delete iServiceHandler;
+ iServiceHandler = NULL;
+ iServiceHandler = CHnServiceHandler::NewL(
+ KMCSService8, interface, KCmdGetList8,
+ EServiceModeAsynchronous, constructorLiw, commandLiw );
+
+ CleanupStack::Pop( commandLiw );
+ CleanupStack::Pop( constructorLiw );
+
+ iServiceHandler->ExecuteL( this );
+
+ CleanupStack::PopAndDestroy( &constructor );
+ CleanupStack::PopAndDestroy( serviceData );
+ CleanupStack::PopAndDestroy( &data );
+ if( filter )
+ {
+ CleanupStack::PopAndDestroy( filter );
+ }
+ if( id )
+ {
+ CleanupStack::PopAndDestroy( id );
+ }
+ CleanupStack::PopAndDestroy( inDataKey );
+ }
+
+ DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyStringL OUT"));
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName( const TDesC& aNewValue )
+ {
+ DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName IN" ));
+ iCRKeyFolderName.Copy( KBlank );
+ iCRKeyFolderItemUid.Copy( KBlank );
+
+ int keyValueLength = aNewValue.Length();
+ if( keyValueLength )
+ {
+ TApaAppGroupName folder;
+ TBuf<KTimeStampBufferLength + KUidStringLength + 1> tempBuf;
+ TBuf<KTimeStampBufferLength> timeStamp;
+
+ TInt ret = aNewValue.Find( KComma );
+ if( (ret == KErrNotFound )|| ( ret == ( keyValueLength-1 ) ) )
+ {
+ DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (bad CR key value input) OUT" ));
+ return; //bad CR key value input
+ }
+ if( ret>KApaMaxAppGroupName )
+ {
+ return;
+ }
+ folder.Copy(aNewValue.Left(ret));
+ if( aNewValue.Length()-ret > tempBuf.MaxLength() )
+ {
+ return;
+ }
+ tempBuf.Copy(aNewValue.Mid( ret + 1 ) );
+
+ TInt posUid = tempBuf.Find( KComma );
+ if ( KErrNotFound != posUid )
+ {
+ if( posUid>KTimeStampBufferLength )
+ {
+ return;
+ }
+ timeStamp.Copy( tempBuf.Left(posUid) );
+ if( tempBuf.Length()-(posUid+1) > KUidStringLength )
+ {
+ return;
+ }
+ iCRKeyFolderItemUid.Copy( tempBuf.Mid( posUid + 1 ) );
+ }
+ else
+ {
+ if( tempBuf.Length()>KTimeStampBufferLength )
+ {
+ return;
+ }
+ timeStamp.Copy( tempBuf );
+ }
+
+ TTime currentTime;
+ currentTime.HomeTime();
+ TTimeIntervalSeconds interval;
+
+ TTime timeStampTime;
+ ret = timeStampTime.Set(timeStamp);
+
+ if(ret == KErrGeneral )
+ {
+ DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (bad timestamp) OUT" ));
+ return; // bad time stamp value
+ }
+
+ ret = currentTime.SecondsFrom( timeStampTime, interval );
+
+ if( interval.Int() < 0 )
+ {//negative timestamp is set ahead of current time...!
+ DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (negative interval) OUT" ));
+ return;
+ }
+
+ if(( interval.Int()) > KTimeStampCutOff )
+ {//positive timestamp but more than 5 seconds
+ DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName (more than 5 seconds) OUT" ));
+ return;
+ }
+ else
+ {
+ iCRKeyFolderName.Copy(folder);
+ }
+ }
+ DEBUG(( "_MM_:CHnRepositoryShowFolderObserver::ExtractCRKeyShowFolderName OUT" ));
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::GetShowFolderL( TUint32 aFolderId )
+ {
+
+ CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
+ KInData8, KKeyTypeMap, KDefaultParentId8 );
+ CleanupStack::PushL( inDataKey );
+ HBufC8* id = HnConvUtils::NumToStr8LC( aFolderId );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KParentOnly8, KKeyTypeBoolean, KStringTrue8 ) );
+
+ RPointerArray< CHnMdBaseKey > data;
+ CleanupClosePushL( data );
+ data.Append( inDataKey );
+
+ CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL(
+ KServiceContentName, KKeyTypeString, KMatrixMenuData );
+ CleanupStack::PushL( serviceData );
+
+ RPointerArray< CHnMdBaseKey> constructor;
+ CleanupClosePushL( constructor );
+ constructor.Append( serviceData );
+ CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC();
+ CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC();
+ HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw );
+ HnLiwUtils::SetGenericParamListL( data, *commandLiw );
+
+ TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 );
+
+ delete iServiceHandler;
+ iServiceHandler = NULL;
+ iServiceHandler = CHnServiceHandler::NewL(
+ KMCSService8, interface, KCmdGetList8,
+ EServiceModeAsynchronous, constructorLiw, commandLiw );
+
+ CleanupStack::Pop( commandLiw );
+ CleanupStack::Pop( constructorLiw );
+
+ iServiceHandler->ExecuteL( this );
+
+ CleanupStack::PopAndDestroy( &constructor );
+ CleanupStack::PopAndDestroy( serviceData );
+ CleanupStack::PopAndDestroy( &data );
+ CleanupStack::PopAndDestroy( id );
+ CleanupStack::PopAndDestroy( inDataKey );
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::GetShowFolderGroupNameL()
+ {
+
+ CHnMdBaseKey* inDataKey = HnMdKeyFactory::CreateL(
+ KInData8, KKeyTypeMap, KDefaultParentId8 );
+ CleanupStack::PushL( inDataKey );
+ HBufC8* id = HnConvUtils::NumToStr8LC( KRootId );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KIdParam, KKeyTypeInteger, *id ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KRecursiveSearch8, KKeyTypeBoolean, KStringTrue8 ) );
+ inDataKey->AddSubKeyL( HnMdKeyFactory::CreateL( KFlatResult8, KKeyTypeBoolean, KStringTrue8 ) );
+
+ CHnMdBaseKey* filter = HnMdKeyFactory::CreateL(
+ KFilter8, KKeyTypeMap, KStringTrue8 );
+ CleanupStack::PushL( filter );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KMcsAppGroupName8, KKeyTypeString, iCRKeyFolderName ) );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KType8, KKeyTypeString, KMenuFolder8 ) );
+ filter->AddSubKeyL( HnMdKeyFactory::CreateL( KHidden8, KKeyTypeBoolean, KStringFalse8 ) );
+
+ RPointerArray< CHnMdBaseKey > data;
+ CleanupClosePushL( data );
+ data.AppendL( inDataKey );
+ if ( filter )
+ {
+ data.AppendL( filter );
+ }
+
+ CHnMdBaseKey* serviceData = HnMdKeyFactory::CreateL(
+ KServiceContentName, KKeyTypeString, KMatrixMenuData );
+ CleanupStack::PushL( serviceData );
+
+ RPointerArray< CHnMdBaseKey> constructor;
+ CleanupClosePushL( constructor );
+ constructor.Append( serviceData );
+ CLiwGenericParamList* constructorLiw = CLiwGenericParamList::NewLC();
+ CLiwGenericParamList* commandLiw = CLiwGenericParamList::NewLC();
+ HnLiwUtils::SetGenericParamListL( constructor, *constructorLiw );
+ HnLiwUtils::SetGenericParamListL( data, *commandLiw );
+
+ TBuf8< KMaxLength > interface( KMCSDataSourceInterface8 );
+
+ delete iServiceHandler;
+ iServiceHandler = NULL;
+ iServiceHandler = CHnServiceHandler::NewL(
+ KMCSService8, interface, KCmdGetList8,
+ EServiceModeAsynchronous, constructorLiw, commandLiw );
+
+ CleanupStack::Pop( commandLiw );
+ CleanupStack::Pop( constructorLiw );
+
+ iServiceHandler->ExecuteL( this );
+
+ CleanupStack::PopAndDestroy( &constructor );
+ CleanupStack::PopAndDestroy( serviceData );
+ CleanupStack::PopAndDestroy( &data );
+ CleanupStack::PopAndDestroy( filter );
+ CleanupStack::PopAndDestroy( id );
+ CleanupStack::PopAndDestroy( inDataKey );
+
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+TInt CHnRepositoryShowFolderObserver::HandleNotifyL(
+ TInt /*aCmdId*/,
+ TInt aEventId,
+ CLiwGenericParamList& aEventParamList,
+ const CLiwGenericParamList& /*aInParamList*/)
+ {
+ DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyL IN"));
+ if( aEventId == KLiwEventCanceled )
+ {
+ return KErrNotFound;
+ }
+ else
+ {
+ TInt pos( 0 );
+ const TLiwGenericParam* first = aEventParamList.FindFirst( pos, KReturnValue8() );
+ if( pos==KErrNotFound )
+ {
+ return KErrNotFound;
+ }
+
+ TInt count = first->Value().AsList()->Count();
+ if( !( iNotifyType & ESECOND_NOTIFY ) ) //first notify
+ {
+ if( iCRKeyFolderName.Length()==0 )
+ {
+ // no app group name
+ // it must be found using parent id
+ if ( count == 0 )
+ {
+ return KErrNotFound;
+ }
+ iNotifyType |= ESECOND_NOTIFY;
+ TLiwVariant varId; varId.PushL();
+ TLiwVariant varParentId; varParentId.PushL();
+
+ HnLiwUtils::GetVariantL( aEventParamList, KIdPath8, 0, varId );
+ HnLiwUtils::GetVariantL( aEventParamList, KParentIdPath8, 0, varParentId );
+
+ TInt32 id( 0 );
+ TInt32 parentId( 0 );
+ varId.Get( id );
+ iCRKeyFolderItemUid.Num( id );
+ varParentId.Get( parentId );
+
+ CleanupStack::PopAndDestroy( &varParentId );
+ CleanupStack::PopAndDestroy( &varId );
+
+ GetShowFolderL( parentId );
+ return KErrNone;
+ }
+ else
+ {
+ // app group name is known
+ if( iNotifyType & EAPP_UID )
+ {
+ // first get list was used to found id for app item
+ iNotifyType |= ESECOND_NOTIFY;
+ if ( count )
+ {
+ // uid was given, id is found
+ // and replaces uid
+ TLiwVariant varId; varId.PushL();
+ HnLiwUtils::GetVariantL( aEventParamList, KIdPath8, 0, varId );
+ TInt32 id( 0 );
+ varId.Get( id );
+ iCRKeyFolderItemUid.Num( id );
+ CleanupStack::PopAndDestroy( &varId );
+ }
+ GetShowFolderGroupNameL();
+ return KErrNone;
+ }
+ else
+ {
+ // intentionally empty
+ // no uid was given so only one get list is needed
+ }
+ }
+ }
+ if ( count == 0 )
+ {
+ return KErrNotFound;
+ }
+
+ TLiwVariant varId; varId.PushL();
+ TLiwVariant varAppGroupName; varAppGroupName.PushL();
+ TLiwVariant varSuiteName; varSuiteName.PushL();
+ TLiwVariant varChildrenCount; varChildrenCount.PushL();
+
+ HnLiwUtils::GetVariantL( aEventParamList, KIdPath8, 0, varId );
+ HnLiwUtils::GetVariantL( aEventParamList, KAppGroupNamePath8, 0, varAppGroupName );
+ HnLiwUtils::GetVariantL( aEventParamList, KTitleNamePath8, 0, varSuiteName );
+ HnLiwUtils::GetVariantL( aEventParamList, KChildrenCountPath8, 0, varChildrenCount );
+
+ CLiwGenericParamList* paramList = CLiwGenericParamList::NewL();
+ CleanupStack::PushL( paramList );
+
+ CLiwDefaultMap* map = CLiwDefaultMap::NewLC();
+
+ paramList->AppendL( TLiwGenericParam( KSuiteName8,
+ TLiwVariant( KFolderSuite ) ) );
+
+ map->InsertL( KSuiteName8, varSuiteName );
+ map->InsertL( KFolderId8, varId );
+ map->InsertL( KRemoveLocked8, TLiwVariant( KStringFalse8 ) );
+ map->InsertL( KParentFolderId8, varId );
+ map->InsertL( KTmpParentFolderId8, varId );
+ map->InsertL( KMcsAppGroupName8, varAppGroupName );
+
+ paramList->AppendL( TLiwGenericParam( KParams8, TLiwVariant( map ) ) );
+
+ CleanupStack::PopAndDestroy( map );
+
+ while ( iCmnPtrs->iModel->LoadedSuitesCount() > 1 )
+ {
+ CHnMdSuite* suite = iCmnPtrs->iModel->GetLastSuite();
+ iCmnPtrs->iContainer->PopSuiteModelL( suite->SuiteName() );
+ iCmnPtrs->iModel->DeleteLastSuite();
+ }
+
+ if ( iCmnPtrs->iContainer->GetLastSuiteModel()->CustomId() != varId.AsTInt64() )
+ {
+ iCmnPtrs->iModelEventObserver->HandleModelEventL( KNewSuiteLoadedMdEvent, *paramList );
+ iCmnPtrs->iContainer->GetLastSuiteModel()->RegisterSuiteObserverL( this );
+ iCmnPtrs->iModel->QueueForeground( CHnMdModel::EWhenCurrentTopSuiteIsEvaluated );
+ }
+ else
+ {
+ iCmnPtrs->iContainer->GetLastSuiteModel()->NotifyObserversL( ESuiteModelInitialized );
+ TLex8 lex( iCRKeyFolderItemUid );
+ TInt64 id (0);
+ TInt err = lex.Val( id );
+ TLiwVariant varItemCustomId; varItemCustomId.PushL();
+ varItemCustomId.Set( id );
+ TLiwVariant varId; varId.PushL();
+ varId.Set( iCmnPtrs->iContainer->GetLastSuiteModel()->CustomId() );
+ CLiwGenericParamList* pl = CLiwGenericParamList::NewL();
+ CleanupStack::PushL( pl );
+ pl->AppendL( TLiwGenericParam( KSuiteCustomId8, varId ) );
+ pl->AppendL( TLiwGenericParam( KItemCustomId8, varItemCustomId ) );
+ iCmnPtrs->iModelEventObserver->HandleModelEventL( KSetFocusEvent, *pl );
+ iCmnPtrs->iModelEventObserver->HandleModelEventL( KAppGainForeground, *pl );
+ CleanupStack::PopAndDestroy( pl );
+ CleanupStack::PopAndDestroy( &varId );
+ CleanupStack::PopAndDestroy( &varItemCustomId );
+
+ iCRKeyFolderItemUid.Copy( KBlank );
+ }
+
+ iNotifyType = 0;
+ iCRKeyFolderName.Copy( KBlank );
+ iRepository->Set( iId, KBlank );
+
+ CleanupStack::PopAndDestroy( paramList );
+ CleanupStack::PopAndDestroy( &varChildrenCount );
+ CleanupStack::PopAndDestroy( &varSuiteName );
+ CleanupStack::PopAndDestroy( &varAppGroupName );
+ CleanupStack::PopAndDestroy( &varId );
+ }
+
+ DEBUG(("_MM_:CHnRepositoryShowFolderObserver::HandleNotifyL OUT"));
+ return KErrNone;
+ }
+
+// ---------------------------------------------------------------------------
+//
+// ---------------------------------------------------------------------------
+//
+void CHnRepositoryShowFolderObserver::HandleSuiteEventL ( THnCustomSuiteEvent aCustomSuiteEvent,
+ CHnSuiteModel *aModel )
+ {
+
+ if ( aCustomSuiteEvent == ESuiteModelInitialized && iCRKeyFolderItemUid.Length() > 0 )
+ {
+ if (iCRKeyFolderItemUid.Length() > 0 )
+ {
+ TLex8 lex( iCRKeyFolderItemUid );
+ TInt64 id (0);
+ TInt err = lex.Val( id );
+ TInt focus( KErrNotFound );
+ // If suite is not null, then find matching item model.
+ CHnItemModel* itemModel = aModel->GetMatchingItemModelL( id, focus );
+ aModel->SetSuiteHighlightL( focus );
+ }
+ iCRKeyFolderItemUid.Copy( KBlank );
+ aModel->UnregisterSuiteObserver( this );
+ CLiwGenericParamList* pl = CLiwGenericParamList::NewL();
+ CleanupStack::PushL( pl );
+ iCmnPtrs->iModelEventObserver->HandleModelEventL( KAppGainForeground, *pl );
+ CleanupStack::PopAndDestroy( pl );
+ }
+ }
+
+// End of File