menufw/hierarchynavigator/hnmetadatamodel/inc/hnxmlmodelprovider.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:40:49 +0200
changeset 0 f72a12da539e
child 54 1b758917cafc
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  
*
*/



#ifndef C_HNMULMODELPROVIDER_H
#define C_HNMULMODELPROVIDER_H


#include <xmlengdom.h>
#include <bautils.h>
#include <e32hashtab.h>

class CHnXmlModelCache;

/**
 * Xml Model Provider
 * 
 * Parses suites definitions in xml and makes changes in model. 
 *
 * @lib hnmetadatamodel
 * @since S60 5.0
 * @ingroup group_hnmetadatamodel
 */
NONSHARABLE_CLASS(CHnXmlModelProvider) : public CActive
    {
public:
    /**
     * Standard factory method.
     *
     * @since S60 v5.0
     * @return Fully constructed object.
     */
    IMPORT_C static CHnXmlModelProvider* NewL();

    /**
     * Standard factory method.
     *
     * @since S60 v5.0
     * @return Fully constructed object.
     */
    IMPORT_C static CHnXmlModelProvider* NewLC();

    /**
     * Standard virtual destructor.
     */
    IMPORT_C virtual ~CHnXmlModelProvider();
    
    /**
     * @see CAsctive::DoCancel
     */
    void DoCancel();

    /**
     * Services the suite synchronization steps according to class iterator.
     *
     * @see CAsctive::RunL
     */
    void RunL();

private:
    
    /**
     * ReadFileLC reads file.
     *
     * @since S60 v5.0
     * @param aPath Path to a file.
     * @return Content of the file.
     */
     HBufC8* ReadFileLC(const TDesC& aPath);

    /**
     * Parses a document.
     *
     * @since S60 v5.0
     * @param aDoc A document to be parsed.
     * @return Xml document.
     */
     RXmlEngDocument ParseDocL( const TDesC8& aDoc );

     
     /**
     * Builds root of xml model from suite definition.
     *
     * @since S60 v5.0
     * @param aSuiteName Suite name.
     * @param aXmlDoc XLM model of the suite.
     * @return Error code.
     */
     TInt CollectSuiteL( const TDesC& aSuiteName, RXmlEngDocument& aXmlDoc );
     
     /**
     * appends items to suite in model,
     *
     * @since S60 v5.0
     * @param aSuiteName Name of suite to append items to.
     * @param aXmlDoc XLM model of the suite.
     */
     void CollectItemsL(const TDesC& aSuiteName, RXmlEngDocument& aXmlDoc );
     
     /**
     * Copies suites and items definitions to working dir.
     *
     * @since S60 v5.0
     * @return Error code.
     */
     TBool SynchronizeSuitesL();
     
    /**
     * Creates model from suite definition.
     *
     * @since S60 v5.0
     * @param aStr Name of suite.
     * @param aXmlDoc XML model of the suite.
     */
    void CreateModelL( const TDesC& aStr, RXmlEngDocument& aXmlDoc  );   
    
    /**
     * Changes event names to ids.
     *
     * @since S60 v5.0
     * @param aElement Xml element.
     */
    void ChangeEventNamesToIdsL( TXmlEngElement& aElement );

    /**
     * Changes event names to items in all the children.
     *
     * @see ChangeEventNamesToIdsL
     * @since S60 v5.0
     * @param aElement Xml element.
     */
    void ChangeEventsToIdsInChildrenL(
            TXmlEngElement & aElement );
    
#ifdef _DEBUG
    /**
     * Logs event mapping.
     *
     * @since S60 v5.0
     * @param aEventMap Event map.
     */
    void LogEventMapping( const RHashMap<HBufC*, TInt>& aEventMap );
#endif

public:     
          
    /**
     * Parses a document.
     *
     * @param aPath Path to a file.
     * @return RXmlEngDocument.
     */
     RXmlEngDocument ParseFileL( const TDesC& aPath );
     
     /**
      * Resets cached models.
      */
     void ResetCache();
     
    /**
     * Reparses a document.
     */
     IMPORT_C void ReloadModelL();
   
    /**
     * Parses a document - searching proper suite.
     *
     * @param aStr Name of the model.
     * @param aXmlDoc A reference to document of RXmlEngDocument class;
     * @return Error code. KErrNone if model found.
     */
    IMPORT_C TInt GetModelL( const TDesC& aStr, RXmlEngDocument& aXmlDoc );
    
     /**
      * Parses a document.
      *
      * @param aEventName Event name.
      * @return Event id.
      */     
     TInt GetNewEventId( HBufC* aEventName );
     
     /**
      * Check if suite exists.
      *
      * @since S60 5.0
      * @param aSuite Suite name.
      * @return ETrue if suite exists, otherwise EFalse.
      */
     TBool SuiteExistsL( const TDesC& aSuite );
    
private:
     
    /**
     * Invoked after asynchronous synchronization is finished.
     */
     void SynchronizationFinishedL();

    /**
     * Sets up normal path to suites.
     *
     * @param aPath Path to be searched for suites.
     */	
     void SearchPathForSuitesL( const TDesC& aPath );
	
    /**
     * Sets up normal path to suites.
     */   
     void SetupSuitePathL();
	
    /**
     * Sets up fail sage path to suites.
     */   
    void SetupFailSafeSuitePathL();
	
    /**
     * Standard C++ constructor.
     */     
    CHnXmlModelProvider();

    /**
     * Standard symbian 2nd phase constructor.
     */     
    void ConstructL();

    /**
    * Finds drive letter where suite definition is.
    *
    * @since S60 v5.0
    * @return Error code
    */
    void CheckDrivesL(); 
               
    
#ifdef _DEBUG
private:
    void LogSuiteModel( const TDesC& aName, 
                                         RXmlEngDocument& aDoc );
#endif // _DEBUG

private: // data

    /**
     * Xml DOM implementation.
     */
    RXmlEngDOMImplementation iDomImpl;

    /**
     * Xml DOM parser.
     */
    RXmlEngDOMParser iDomParser;
                
    /**
     * File server session
     */
    RFs iFs;
        
    /**
     * File manager
     */
    CFileMan* iFileMan;                
    
    /**
     * List containing names of suites (suite name is same as dir name)
     * that should be installed from all drives
     */    
    RHashSet< HBufC* > iInstSuites;
    
    /**
     * Event map.
     */
    RHashMap< HBufC*, TInt > iEventMap;
    
    /**
     * Main path.
     */
    RBuf iPath;
    
    /**
     * Cached suites.
     */
    CHnXmlModelCache* iCache;
    
    /**
     * Own. Iterator used in synchronisation. 
     * Indicates next suite name to be synchronised.
     */
    THashSetIter<HBufC*>* iSuiteSetIterator;

    /**
     * ETrue if suite files on the c: drive were updated during the
     * last synchronization. New suite files also count as updated.
     * EFalse if the last synchronization did not alter any files
     * on the c: drive.
     */
    TBool iSuiteFilesUpdated;

    };
#endif // C_HNMULMODELPROVIDER_H