menucontentsrv/srvinc/menusrvfoldercrnotifier.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:17 +0200
changeset 0 79c6a41cd166
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2009 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:
*
*/

#ifndef __MENUSRVFOLDERSCANNER_H__
#define __MENUSRVFOLDERSCANNER_H__

#include <e32base.h>
#include <apgcli.h>
#include <apgnotif.h>
#include <cenrepnotifyhandler.h> 
#include "menuengoperation.h"
#include "menuengfilter.h"
#include "mcsfreespaceobserver.h"


// FORWARD DECLARATION

class CMenuEng;
class TMenuItem;
class CMenuSrvMmcHistory;
class CRepository;
class CCenRepNotifyHandler;

/**
* Folder scanner.
* Using AppArc application information, keeps menu application
* items ("menu:application") up-to-date.
*
* Operation is asynchronous (because AppArc startup is asynchronous):
* 1. ConstructL(): invokes iApaLsSession to build app list (async).
* 2. RunL(): App list is complete, this object schedules itself to Engine.
* 3. RunMenuEngOperationL(): The operation is executed by the engine.
* 4. HandleAppListEvent(): change in app list, go back to step 2.
*
* App scanning does the following:
* - Applications present in the system but not appearing in the menu are added
*   to the appropriate folder.
* - Java apps should appear / disappear.
* - Hide hidden applications, show non-hidden applications (flag "hidden").
* - Hide / show MMC-related items, according to whether MMC is present or not
*   (flag "missing"). Keep an MMC history, purge old MMC-based menu items
*   (== missing menu items whose MMC card has not been seen for long).
* - Observing AppArc (and MMC, and Java, etc etc) to keep the menu data up
*   to date continuously.
*/
NONSHARABLE_CLASS( CMenuSrvFolderCrNotifier )
: public CActive, public MMenuEngOperation, public MCenRepNotifyHandlerCallback, 
MMcsFreeSpaceObserver
    {

public:     // Constructor

    /**
    * Destructor.
    */
    virtual ~CMenuSrvFolderCrNotifier();

    /**
    * Two-phased constructor.
    * @param aEng Engine.
    */
    static CMenuSrvFolderCrNotifier* NewL( CMenuEng& aEng );

private:    // Constructors and destructor

    /**
    * Constructor.
    * @param aEng Engine.
    */
    CMenuSrvFolderCrNotifier( CMenuEng& aEng );

    /**
    * Second phased constructor.
    */
    void ConstructL();

private:    // from CActive

    /**
    * Request completed, schedule engine operation.
    */
    void RunL();

    /**
    * Cancel request.
    */
    void DoCancel();

    /**
    * Error handling: ignore error.
    * @param aErr Error code.
    */
    TInt RunError( TInt aError );
    
private:    // from MMcsFreeSpaceObserver
    /**
     * Handle Free Space Event.
     */
    void HandleFreeSpaceEventL();

private:    // from MMenuEngOperation

    /**
    * Execute engine operation:
    * Do the application scan and update menu accordingly.
    */
    void RunMenuEngOperationL();

    /**
    * Error handling: ignore error.
    * @param aErr Error code.
    */
    void CompletedMenuEngOperation( TInt aErr );
    
    /**
     * Notifies engine with events
     * @param aNewHiddenFolder nome of a folder. 
     */ 
    void NotifyEngineL( const TDesC& aFolder );

    /**
     * Compares arrays and sends notification to engine abaut differences
     * @param aLeftArray array with folders names. 
     * @param aRightArray array with folders names.
     */ 
    void NotifyEngineL( const RArray<TPtrC>& aLeftArray, 
    		const RArray<TPtrC>& aRightArray );
    
    /**
     */ 
    void HandleNewCrHiddenFoldersL( const TDesC& aNewHiddenFolder );
    


private:    // from MCenRepNotifyHandlerCallback 

    /**
    * Called if one of CR keys has changed
    * @param aId  Id of the key that has changed.  
    * @param aNewValue  The new value of the key.  
    */
    void HandleNotifyString( TUint32 aKey, const TDesC16& aNewValue );


private:    // new methods

    /**
     */ 
    void ParseHiddenFoldersL(  const TDesC& aHiddenFolders, 
                                RArray<TPtrC>& aHiddenFoldersArray );

private:    // data
    
    CMenuEng& iEng ; ///< Engine.
    RFs iFs; ///< File Server Session. Own.

    /*
    * Central repository session
    */
	CRepository* iCenRepSession;

    /*
    *Central repository change handler for Control Panel Hidden Folders
    */
    CCenRepNotifyHandler* iCenRepNotifyHandlerCPHiddenFolders;	

    TBool iOpStatus;

    /*
     * Free Space observer.
     */
    CMcsFreeSpaceObserver* iFreeSpaceObserver;

    /*
    * Old value from central repository.
    */
    RBuf iHiddenCRFolders;
    
    /*
    * New value from central repository.
    */
    RBuf iNewHiddenCRFolders;
    
    };



#endif // __MENUSRVFOLDERSCANNER_H__