menufw/hierarchynavigator/hnmetadatamodel/src/hnrepositoryobserver.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 13 Oct 2010 14:18:30 +0300
branchRCL_3
changeset 102 ba63c83f4716
parent 93 b01126ce0bec
permissions -rw-r--r--
Revision: 201039 Kit: 201041

/*
* 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