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