ncdengine/provider/server/inc/ncdfavoritemanagerimpl.h
changeset 0 ba25891c3a9e
child 12 7ca52d38f8c3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdfavoritemanagerimpl.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,322 @@
+/*
+* Copyright (c) 2006 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:   Contains CNcdFavoriteManager class
+*
+*/
+
+
+#ifndef NCDFAVORITEMANAGER_H
+#define NCDFAVORITEMANAGER_H
+
+#include "catalogscommunicable.h"
+#include "ncdstoragedataitem.h"
+
+class CNcdNodeManager;
+class CNcdNodeIdentifier;
+class RWriteStream;
+class MNcdStorageManager;
+class CNcdNodeDisclaimer;
+class CNcdGeneralManager;
+
+/**
+ * CNcdFavoriteManager manages the list of favorite nodes.
+ */
+class CNcdFavoriteManager : public CCatalogsCommunicable 
+{
+public:
+    /**
+     * NewL
+     *
+     */
+    static CNcdFavoriteManager* NewL( CNcdGeneralManager& aGeneralManager );
+    
+    
+    /**
+     * NewLC
+     *
+     */
+    static CNcdFavoriteManager* NewLC( CNcdGeneralManager& aGeneralManager );
+
+    /**
+     * Destructor
+     */
+    virtual ~CNcdFavoriteManager();
+    
+    /**
+     * Returns the number of clients whose favorite identifiers has been loaded to
+     * ram cache.
+     */
+    TInt ClientCount() const;
+    
+    /**
+     * Returns a client uid by the given index.
+     *
+     * @param aClientIndex The index.
+     * @return The client uid.
+     * @leave KErrNotFound If the given index is out of range.
+     */
+    TUid ClientL( TInt aClientIndex ) const; 
+    
+    /**
+     * Returns the client's favorite nodes.
+     *
+     * @param aClientUid The client uid.
+     * @return The favorite nodes.
+     * @leave System wide error code.
+     */
+    const RPointerArray<CNcdNodeIdentifier>& FavoriteNodesL(
+        const TUid& aClientUid );
+        
+    /**
+     * Tells whether the given node is a favorite node.
+     *
+     * @param aNodeIdentifier The node identifier.
+     * @return ETrue if the node is a favorite node, otherwise false.
+     */
+    TBool IsFavorite( const CNcdNodeIdentifier& aNodeIdentifier ) const;
+             
+
+    /**
+     * Removes client's favorites from database
+     */
+    void RemoveFavoritesL( const TUid& aClientUid );
+    
+public: // from CCatalogsCommunicable
+
+    /**
+     * @see CCatalogsCommunicable::ReceiveMessage
+     */
+    virtual void ReceiveMessage(
+        MCatalogsBaseMessage* aMessage, 
+        TInt aFunctionNumber );
+        
+    /**
+     * @see CCatalogsCommunicable::CounterPartLost
+     */
+    virtual void CounterPartLost(
+        const MCatalogsSession& aSession );
+    
+protected:
+
+    class CNcdClientFavorites;
+    class CNcdTemporaryFavorites;
+    
+    CNcdFavoriteManager( CNcdGeneralManager& aGeneralManager );
+    
+    void ConstructL();
+    
+    /**
+     * Called from ReceiveMessage if favorite is added.
+     */
+    void AddFavoriteRequestL( MCatalogsBaseMessage& aMessage );
+
+    /**
+     * Called from ReceiveMessage if favorite is removed.
+     */
+    void RemoveFavoriteRequestL( MCatalogsBaseMessage& aMessage );
+    
+    /**
+     * Called from ReceiveMessage if disclaimer need to be added or removed.
+     */
+    void SetDisclaimerRequestL( MCatalogsBaseMessage& aMessage );
+    
+    /**
+     * Called from ReceiveMessage if disclaimer handle is requested.
+     */
+    void DisclaimerHandleRequestL( MCatalogsBaseMessage& aMessage );
+    
+    /**
+     * Called from ReceiveMessage if proxy object wants to release the server side
+     * object.
+     */    
+    void ReleaseRequest( MCatalogsBaseMessage& aMessage );
+    
+    /**
+     * Called from ReceiveMessage if proxy object wants to internalize its state
+     * from server side.
+     */    
+    void InternalizeRequestL( MCatalogsBaseMessage& aMessage );
+    
+    /**
+     * Adds the given favorite node.
+     *
+     * @param aNodeIdentifier The identifier.
+     */
+    void AddFavoriteL( CNcdNodeIdentifier* aNodeIdentifier );
+    
+    /**
+     * Adds the given favorite node temporarily. The node is removed from
+     * favorites when the given session is closed.
+     *
+     * If the node is favorite node already, nothing is done.
+     *
+     * @param aNodeIdentifier The identifier.
+     * @param aSession The session.
+     */
+    void AddTemporaryFavoriteL(
+        CNcdNodeIdentifier* aNodeIdentifier,
+        MCatalogsSession& aSession );
+    
+    /**
+     * Removes the given favorite node.
+     *
+     * @param aNodeIdentifier The identifier.
+     */
+    void RemoveFavoriteL( CNcdNodeIdentifier* aNodeIdentifier );
+    
+    /**
+     * Removes the temporary favorites of the given session.
+     *
+     * @param aSession The session.
+     */
+    void RemoveTemporaryFavoritesL( MCatalogsSession& aSession );
+    
+    /**
+     * Externalizes the favorite identifiers of the given client to the given stream.
+     *
+     * @param aStream The stream.
+     * @param aClientUid The client uid.
+     */
+    void ExternalizeIdentifiersL( RWriteStream& aStream, const TUid& aClientUid );
+    
+    /**
+     * Finds the favorite node set of the given client.
+     *
+     * @param aClientUid The client uid.
+     * @return Index of the set in iFavorites member variable or KErrNone if the
+     *         client does not exist.
+     */
+    TInt FindClientFavorites( const TUid& aClientUid ) const;
+    
+    /**
+     * Returns the temporary favorites of the given session. The given
+     * object is created if there is no existing CNcdTemporaryFavorites object
+     * for the given session.
+     *
+     * @param aSession The session.
+     * @return The temporary favorites of the session.
+     */
+    CNcdTemporaryFavorites& TemporaryFavoritesL( MCatalogsSession& aSession );
+    
+    /**
+     * Tells whether the given session has temporary favorites.
+     *
+     * @param aSession The session.
+     * @return ETrue if there are temporary favorites, otherwise false.
+     */
+    TBool HasTemporaryFavorites( MCatalogsSession& aSession ) const;
+    
+    /**
+     * Loads the client's favorite identifiers from database. If the database
+     * does not contain any favorite identifiers, creates an empty identifier set
+     * for the client to iFavorites member variable.
+     *
+     * @param aClientUid The client uid.
+     */
+    void DbLoadFavoritesL( const TUid& aClientUid );
+    
+    /**
+     * Saves the given client's favorite identifiers to the database.
+     *
+     * @param aFavorites The favorites to save.
+     */ 
+    void DbSaveFavoritesL( CNcdClientFavorites& aFavorites );    
+    
+    
+private:
+
+    /**
+     * CNcdClientFavorites object encapsulates the favorite identifiers of one
+     * client.
+     */
+    class CNcdClientFavorites : public CBase,
+                                public MNcdStorageDataItem
+        {
+    public:
+        static CNcdClientFavorites* NewLC( const TUid& aClientUid );
+        ~CNcdClientFavorites();
+        
+        TUid ClientUid() const;
+        void AddFavoriteL( CNcdNodeIdentifier* aNodeIdentifier );
+        void RemoveFavorite( const CNcdNodeIdentifier& aNodeIdentifier );
+        void RemoveFavorites();
+        void SetDisclaimerL(
+            const CNcdNodeIdentifier& aNodeIdentifier,
+            const CNcdNodeDisclaimer& aDisclaimer );
+        void RemoveDisclaimer( const CNcdNodeIdentifier& aNodeIdentifier );
+        CNcdNodeDisclaimer* Disclaimer(
+            const CNcdNodeIdentifier& aNodeIdentifier ) const;
+            
+        TBool HasFavorite( const CNcdNodeIdentifier& aNodeIdentifier ) const;
+        
+        const RPointerArray<CNcdNodeIdentifier>& Identifiers() const;
+        void ExternalizeIdentifiersL( RWriteStream& aStream ) const;
+                
+    public: // from MNcdStorageDataItem
+
+        /* 
+        * @see MNcdStorageDataItem::ExternalizeL
+        */
+        virtual void ExternalizeL( RWriteStream& aStream );
+
+        /* 
+        * @see MNcdStorageDataItem::InternalizeL
+        */
+        virtual void InternalizeL( RReadStream& aStream );
+        
+    protected:
+        CNcdClientFavorites( const TUid& aClientUid );
+        void CloseDisclaimers();
+        
+    private: 
+        
+        // Node identifiers.
+        RPointerArray<CNcdNodeIdentifier> iIdentifiers;
+        // Node disclaimers. A disclaimer at index 'i' is disclaimer of the node at
+        // the same index.
+        RPointerArray<CNcdNodeDisclaimer> iDisclaimers;
+        
+        // Client uid.
+        TUid iClientUid;
+        };
+        
+        
+    class CNcdTemporaryFavorites : public CBase 
+        {
+    public: // public functions
+        CNcdTemporaryFavorites( MCatalogsSession& aSession );
+        ~CNcdTemporaryFavorites();
+        
+        
+    public: // member variables
+        MCatalogsSession& iSession;
+        RPointerArray<CNcdNodeIdentifier> iFavoriteIdentifiers;
+        };
+        
+    CNcdGeneralManager& iGeneralManager;
+    
+    // Node manager.        
+    CNcdNodeManager& iNodeManager;
+    
+    // Favorite nodes of all the clients.
+    RPointerArray<CNcdClientFavorites> iFavorites;
+    
+    // Temp favorite mappings.
+    RPointerArray<CNcdTemporaryFavorites> iTempFavorites;
+    
+    // Storage manager.
+    MNcdStorageManager& iStorageManager;       
+};
+
+#endif