ncdengine/provider/server/inc/ncdnodeseeninfo.h
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ncdengine/provider/server/inc/ncdnodeseeninfo.h	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,338 @@
+/*
+* 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_NCDNODESEENINFO_H
+#define C_NCDNODESEENINFO_H
+
+#include <e32base.h>
+#include "ncdstoragedataitem.h"
+#include "ncdnodefactory.h"
+
+// Defines the maximum amount of "new" idenfifiers. If
+// this value is exceeded then older identifiers will be
+// removed from the bottom of the "new" list.
+const TInt KNewListMaxSize(50);
+
+class CNcdNodeIdentifier;
+class MNcdStorageManager;
+class CNcdNodeManager;
+class CNcdNodeFolder;
+class CNcdChildEntity;
+class CNcdChildEntityMap;
+class CNcdGeneralManager;
+
+enum TNcdNewStatus
+    {
+    /** Node itself is new */
+    ENcdStatusNew = 0x00000001,
+    /** Node itself is new */
+    ENcdStatusNewButSeen = 0x00000010,
+    /** Folder contains new items */
+    ENcdStatusNewNodesInside = 0x00000100
+    };
+
+/**
+ * Stores information about new nodes.
+ */
+class CNcdNodeSeenInfo : public CBase
+    {
+public:
+    static CNcdNodeSeenInfo* NewL( CNcdGeneralManager& aGeneralManager );
+         
+    static CNcdNodeSeenInfo* NewLC( CNcdGeneralManager& aGeneralManager );
+         
+    ~CNcdNodeSeenInfo();
+    
+    /**
+     * Adds a structure identifier to the new list if it does not exist yet.
+     * If it does exist, it will be moved to the top of the list.
+     *
+     * @param aStructureIdentifier The identifier.
+     * @param aNewStatus New status of the node.
+     */
+    void AddNewIdL( const CNcdNodeIdentifier& aStructureIdentifier,
+        TNcdNewStatus aNewStatus, CNcdNodeFactory::TNcdNodeType aNodeType );
+        
+    void AddNewIdL( const CNcdChildEntity& aChildEntity );
+    
+    /**
+     * Tells whether the given structure node is seen.
+     *
+     * @param aStructureIdentifier The structure node identifier.
+     * @return ETrue if the node is seen, otherwise EFalse.
+     */
+    TBool IsSeenL( const CNcdNodeIdentifier& aStructureIdentifier );
+    
+    /**
+     * Sets the given structure node as seen. Affects only after
+     * CommitChangesL.
+     *
+     * @param aStructureIdentifier The structure node identifier.
+     */
+    void SetSeenL( const CNcdNodeIdentifier& aStructureIdentifier );
+    
+    
+    /**
+     * Checks the new statuses of a folder's children against the previous children.
+     * The folder's and it's parent hierarchy's new statuses are set if needed.
+     * The previous array is fetched from the folder.
+     *
+     * @param aParentFolder The parent folder to check.
+     */
+    void CheckFolderNewStatusL( CNcdNodeFolder& aParentFolder );
+    
+    /**
+     * Checks the new statuses of a folder's children against the previous children.
+     * The folder's and it's parent hierarchy's new statuses are set if needed.
+     * The previous array is fetched from the folder.
+     *
+     * @param aParentFolder The parent folder to check.
+     * @param aPreviousChildArray The previous children to check against.
+     */
+    void CheckFolderNewStatusL(  CNcdNodeFolder& aParentFolder,
+        const RPointerArray<CNcdChildEntity>& aPreviousChildArray );
+    
+    /**
+     * Checks the new status of a child node against the parent folder's
+     * previous children. The parent hierarchy's new statuses are set if needed.
+     *
+     * @param aParentFolder The parent folder of the node.
+     * @param aChildIndex The index of the child node to check.
+     */
+    void CheckChildNewStatusL( CNcdNodeFolder& aParentFolder, TInt aChildIndex );
+    
+    
+    /**
+     * Clears the new list completely.
+     *
+     * @param aClient Uid of the client whose list will be cleared.
+     */
+    void ClearInfoL( const TUid& aClientUid );
+    
+    /**
+     * Commits the changes made by SetSeenL (the seen nodes are be removed from the new list)
+     * and saves seen info to the database storage.
+     *
+     * @param aClient Uid of the client whose changes are committed.
+     */
+    void CommitChangesL( const TUid& aClientUid );
+    
+     /**
+     * Creates lists of previous children for the children of the given folder.
+     *
+     * @note Only folders with type CNcdNodeFactory::ENcdNodeFolder are handled
+     * (e.g. bundles are not handled).
+     * @param aParentFolder The folder.
+     * @param aChildEntityMaps Will contain a child entity map for each child on return.
+     */
+    void CreatePreviousListsForChildrenL( CNcdNodeFolder& aParentFolder,
+        RPointerArray<CNcdChildEntityMap>& aChildEntityMaps );
+    
+    /**
+     * Stoeres previous child lists for the existing child folders of the given folder.
+     *
+     * @param aParentFolder The folder.
+     * @param aChildEntityMaps Child entity maps containing the previous lists.
+     */
+    void StorePreviousListsToExistingChildrenL( CNcdNodeFolder& aParentFolder,
+        const RPointerArray<CNcdChildEntityMap>& aChildEntityMaps );
+    
+    /**
+     * Does a new status check for the transparent children of the given folder.
+     *
+     * @param aParentFolder The folder.
+     */
+    void DoNewCheckForTransparentChildrenL( CNcdNodeFolder& aParentFolder );
+
+    /**
+     * Immediately removes new id for the folder if no new children exist.
+     */
+    void RefreshFolderSeenStatusL( const CNcdNodeIdentifier& aNodeIdentifier );
+
+private:
+    class CClientSeenInfo;
+    class CNcdNodeNewStatus;
+
+    CNcdNodeSeenInfo( CNcdGeneralManager& aGeneralManager );
+    void ConstructL();
+    
+    /**
+     * Returns the client's client info, if one exists.
+     *
+     * @param aClientUid The uid of the client.
+     * @return The client info, or NULL. Ownership is not transferred.
+     */
+    CClientSeenInfo* ClientInfo( const TUid& aClientUid ) const;
+    
+    /**
+     * Checks that is the given identifier in the new status array.
+     *
+     * @param aNodeIdentifier The identifier to search for.
+     * @return The index of the given identifier in the array if found,
+     * otherwise KErrNotFound.
+     */
+    TInt IndexInNewStatusArray( const CNcdNodeIdentifier& aNodeIdentifier ) const;
+    
+    /**
+     * Getter for node new status.
+     *
+     * @param aNodeIdentifier The identifier to search for.
+     * @return New status for the node, NULL if not found.
+     */
+    CNcdNodeNewStatus* NodeNewStatus( const CNcdNodeIdentifier& aNodeIdentifier );
+    TInt IndexInSeenArray( const CNcdNodeIdentifier& aNodeIdentifier ) const;    
+    TBool IsAddedAsSeen( const CNcdNodeIdentifier& aNodeIdentifier ) const;
+    
+    void RemoveFromSeenListL( const CNcdNodeIdentifier& aNodeIdentifier );
+    void RemoveFromNewListL( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    TBool IsClientInfoLoaded( const TUid& aClientUid ) const;
+    void RemoveClientInfo( const TUid& aClientUid );
+    
+    void DbLoadClientInfoL( const TUid& aClientUid );
+    void DbSaveClientInfoL( const TUid& aClientUid );
+  
+    /**
+     * Removes the given structure identifier from the new list.
+     *
+     * @param aStructureIdentifier The structure node identifier.
+     */    
+    void RemoveNewIdL( const CNcdNodeIdentifier& aStructureIdentifier );
+    
+    /**
+     * Checks that does the given child entity exist in the given array.
+     * Comparison is done with identifier only.
+     *
+     * @param aChildEntity The child to search for.
+     * @param aChildArray The array to search from.
+     * @param aNodeWithSameIndexFound Set to ETrue if there is a
+     * node in aChildArray with the same index as aChildEntity has. NOTE:
+     * Since this is not needed if node is found the searching will stop and
+     * this value may not have been set correctly! Only use if node not found!
+     * @return ETrue if a child with the same identifier is found in the array.
+     */
+    TBool ChildExistsInArrayL( const CNcdChildEntity& aChildEntity,
+        const RPointerArray<CNcdChildEntity>& aChildArray,
+        TBool& aNodeWithSameIndexFound );
+        
+    /**
+     * Checks whether a folder has new children that are have not been set seen.
+     * Check is made against current new list only, no comparison against
+     * previous child array is made.
+     */
+    TBool FolderHasNewUnseenChildrenL( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    /**
+     * Checks whether a folder has new children. Being set seen has no effect here.
+     * Check is made against current new list only, no comparison against
+     * previous child array is made.
+     */
+    TBool FolderHasNewChildrenL( const CNcdNodeIdentifier& aNodeIdentifier );
+        
+    /**
+     * Adds a seen id.
+     */
+    void AddSeenIdL( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    /**
+     * Sets a folder seen if it no longer has new child items.
+     */
+    void SetFolderSeenIfNeededL( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    /**
+     * Sets all children of the folder new.
+     */
+    void SetChildrenNewL( CNcdNodeFolder& aParentFolder );
+        
+private:
+
+    class CClientSeenInfo : public CBase,
+                            public MNcdStorageDataItem
+        {
+    public:
+        CClientSeenInfo( const TUid& aClientUid );
+        ~CClientSeenInfo();
+    
+    public: // from MNcdStorageDataItem
+
+        /* 
+        * @see MNcdStorageDataItem::ExternalizeL
+        */
+        virtual void ExternalizeL( RWriteStream& aStream );
+
+        /* 
+        * @see MNcdStorageDataItem::InternalizeL
+        */
+        virtual void InternalizeL( RReadStream& aStream );
+            
+    public: // member variables
+        
+        // List of node new statuses.
+        RPointerArray<CNcdNodeNewStatus> iNodeNewStatusArray;
+        // List of seen nodes.
+        RPointerArray<CNcdNodeIdentifier> iSeenStructureIds;
+        TUid iClientUid;
+        };
+    
+    /**
+     * Node new status.
+     */
+    class CNcdNodeNewStatus : public CBase
+        {
+    public:
+        static CNcdNodeNewStatus* NewL( const CNcdNodeIdentifier& aNodeIdentifier,
+            TNcdNewStatus aNewStatus, CNcdNodeFactory::TNcdNodeType aNodeType );
+        static CNcdNodeNewStatus* NewLC( const CNcdNodeIdentifier& aNodeIdentifier,
+            TNcdNewStatus aNewStatus, CNcdNodeFactory::TNcdNodeType iNodeType );
+        static CNcdNodeNewStatus* NewL( RReadStream& aReadStream );
+        static CNcdNodeNewStatus* NewLC( RReadStream& aReadStream );
+        ~CNcdNodeNewStatus();
+    public:
+        const CNcdNodeIdentifier& Identifier() const;
+        TNcdNewStatus NewStatus() const;
+        void SetNewStatus( TNcdNewStatus aNewStatus );
+        CNcdNodeFactory::TNcdNodeType NodeType() const;
+        void ExternalizeL( RWriteStream& aStream );
+        void InternalizeL( RReadStream& aStream );
+        
+    private:
+        CNcdNodeNewStatus( TNcdNewStatus aNewStatus,
+            CNcdNodeFactory::TNcdNodeType aNodeType );
+        CNcdNodeNewStatus();
+        void ConstructL( const CNcdNodeIdentifier& aNodeIdentifier );
+    
+    private: //Data
+        CNcdNodeIdentifier* iNodeIdentifier;
+        TNcdNewStatus iNewStatus;
+        CNcdNodeFactory::TNcdNodeType iNodeType;
+        };
+    
+    CNcdGeneralManager& iGeneralManager;
+    
+    RPointerArray<CClientSeenInfo> iClientSeenInfos;
+    
+    // Storage manager.
+    MNcdStorageManager& iStorageManager;
+    
+    // Node manager.
+    CNcdNodeManager& iNodeManager;       
+    
+    };
+
+#endif // C_NCDNODESEENINFO_H
+